当前位置: 首页 > 科技观察

Swift3即将发布,有哪些亮点?

时间:2023-03-23 11:51:44 科技观察

介绍Swift3将于今年晚些时候正式发布,它将对所有Swift开发者产生重大影响。如果您没有密切关注Swift项目,您可能想知道Swift3中即将发生哪些变化,它将如何影响您的编码,以及何时开始将您的代码移植到Swift3。在本文中,我将重点介绍Swift3将给你的编码带来的巨大变化。至于有什么变化,一起来看看吧!准备工作Swift3的预览版已经和Xcode8beta版一起发布了。虽然Swift3的巨大改进不太可能,但在未来几个月内可能仍有一些可以接受的变化。当Xcode在2016年底发布其GM版本时,其功能将不再改变,因此您将不得不继续延迟发布您的应用程序,直到您将Swift3应用程序发布到AppleAppStore。为了让开发者可以根据自己的需要调整Swift3,苹果特意在Xcode8中提供了Swift2.3版本作为Swift的小规模更新。作为开发人员,Swift2.3与Swift2.2基本一致,但支持Apple在WWDC上宣布的许多新SDK和Xcode功能。一旦Xcode8过了测试版,您就可以提交使用Swift2.3开发的应用程序——如果您还没有将您的代码迁移到Swift3。因此,我建议您尝试我们在本文中讨论的功能,甚至在您的项目上运行迁移助手;这样,您就可以感受到正在发生的变化。但是,由于在Xcode8和Swift3正式发布之前您无法将您的应用程序发布到AppleAppStore,因此您可能需要考虑等到一切就绪后再将您的代码移植到Swift3。迁移到Swift3转换到Swift3版本时,你会发现几乎每个文件都需要更改!这主要是因为所有CocoaAPI名称都已更改。或者,更准确地说,尽管API相同,但一个名称适合ObjectiveC,而另一个适合Swift。Swift3的目标是在未来的许多年里让编写Swift代码变得更加自然。Apple在Xcode8中包含了一个MigrationAssistant,它在帮助解决上述大规模代码更改问题方面做得非常出色。但是,您仍然需要修改一些地方,请不要感到惊讶,因为porter程序不会自动处理这些。您可以立即将以前的代码转换为Swift2.3或Swift3。如果您需要将其改回来,您可以随时使用Xcode中提供的命令“编辑>转换>为当前Swift语法...”。幸运的是,编译器和迁移助手一样聪明。如果您不小心在方法调用中使用了旧式API,编译器会提供一个“FixIt”选项,帮助您使用正确的新式API。最好的消息是Swift3将成为最后一个进行大量源代码更改的版本。所以,从长远来看,你应该保持你的程序的Swift代码从一个版本到另一个版本。虽然Swift核心团队无法预测未来,但如果他们确实需要破坏源兼容性,他们已承诺长期支持重用已弃用的代码。这意味着该语言已获得源稳定性保证,这将有助于鼓励保守的公司采用它。也就是说,实现二进制稳定性的目标尚未实现。在本文的最后,您会发现受此影响的更多方面。实施Swift进化提案目前,社区成员已经提交了100多条改进Swift的建议,因为它是开源的。大量提案(目前70多个)经讨论修改后被采纳。当然,那些后来被驳回的提议也引发了一些激烈的讨论。然而,最终,核心团队将对各种提案做出最终决定。核心团队与更广泛社区之间的合作已经令人印象深刻。事实上,Swift在Github上已经获得了30,000颗星。每周都会提交几个新提案。甚至Apple工程师在想要进行更改时也会通过Github存储库提交建议。在以下段落中,您将看到诸如[SE-0001]之类的链接标记。它们是Swift进化建议编号。此处提供的建议数字已全部被接受,并将在最终的Swift3.0版本中使用。我提供这些数据是为了让您可以找到指向每个特定更改的完整详细信息的链接。API变化Swift3最大的更新是它的标准库API都使用了一致的命名约定。Apple的APIDesignGuidelines(https://swift.org/documentation/api-design-guidelines/)规定了开发团队在构建Swift3项目时应遵循的规则,这些规定对于新程序员理解源代码可读性极其有帮助和无障碍。核心团队工作的一个重要指导原则是“好的API设计总是考虑调用者”。他们努力使代码清晰易用。事不宜迟,以下是API中最有可能影响您的一些更改。首选项标签让我们从一个您可能每天都在使用的Swift示例开始。现在,函数和方法的第一个参数总是有一个标签,除非您另有要求。以前,当您调用函数或方法时,第一个参数标签总是被省略(SE-0046)。参考如下代码://注意下面代码第一行是旧式Swift2形式,第二行对应新式Swift3形式"RW".writeToFile("filename",atomically:true,encoding:NSUTF8StringEncoding)"RW".write(toFile:"filename",atomically:true,encoding:NSUTF8StringEncoding)SKAction.rotateByAngle(CGFloat(M_PI_2),duration:10)SKAction.rotate(byAngle:CGFloat(M_PI_2),duration:10)UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)UIFont.preferredFont(forTextStyle:UIFontTextStyleSubheadline)overridefuncnumberOfSectionsInTableView(tableView:UITableView)->IntoverridefuncnumberOfSections(intableView:UITableView)->IntfuncviewForZoomingInScrollView(scrollView:UIScrollView)->UIView?funcviewForZooming(inscrollView:UIScrollView)->UIView?NSTimer.scheduledTimerWithTimeInterval(0.35,target:self,selector:#selector(reset),userInfo:nil,repeats:true)NSTimer.scheduledTimer(timeInterval:0.35,target:self,selector:#selector(reset)),用户信息:无,重复:真)注意,如何在上面的方法定义中使用类似“of&rdq”的东西uo;、“to”、“with”和“in”都是优化代码可读性的一部分。如果方法调用的可读性在没有介词的情况下已经很好并且不需要标签,那么你应该显式地使用下划线来排除第一个参数名称:overridefunctableView(_tableView:UITableView,numberOfRowsInSectionsection:Int)->Int{...}overridefuncdidMoveToView(_view:SKView){...}在许多编程语言中,方法可能共享基本命名并提供不同的参数名称。斯威夫特也不例外。所以,现在你会遇到很多重载的方法命名,因为之前的Api翻译的更直接,更易读。index()方法的两个表达式如下:letnames=["Anna","Barbara"]ifletannaIndex=names.index(of:"Anna"){print("Barbara'position:\(names.index(after:annaIndex))")}}总体而言,参数名称的变化使方法命名更加一致且更易于学习。忽略不必要的关键字在以前版本的Apple库中,方法包含一个名称来指示它们的返回值。由于Swift编译器提供了新的类型检查功能,这样的格式不再是必需的。开发团队认真研究了如何过滤掉所有不需要的部分,只留下必要的部分;结果,大量的单词被删除了。在如何将ObjectiveC转换为原生Swift方面,新的API变得非常明智(SE-005)://注意下面代码的第一行是老式的Swift2形式,第二行对应到新式Swift3形式insert("Jane",atIndex:0)names.insert("Jane",at:0)UIDevice.currentDevice()UIDevice.current()GCD和CoreGraphics更新说到顽固的旧API,GCD和CoreGraphics都在急需改造。今天,这项工作已经开始。GCD库适用于长期计算或与服务器通信等多线程任务。通过将活动移动到不同的线程,您可以防止UI锁定。Libdispatch库是用C语言编写的,并维护着C风格的API。现在,在原生Swift中,此API已被重写(SE-0088)。请参考以下代码://oldway,Swift2letqueue=dispatch_queue_create("com.test.myqueue",nil)dispatch_async(queue){print("HelloWorld")}//newway,Swift3letqueue=DispatchQueue(label:"com.test.myqueue")queue.async{print("HelloWorld")}同样,CoreGraphics库的部分内容也是用C编写的,并以旧式调用(SE-0044)。现在可以重写了。请参考以下示例代码展示://oldway,Swift2letctx=UIGraphicsGetCurrentContext()letrectangle=CGRect(x:0,y:0,width:512,height:512)CGContextSetFillColorWithColor(ctx,UIColor.blueColor().CGColor)CGContextSetStrokeColorWithColor(ctx,UIColor.whiteColor().CGColor)CGContextSetLineWidth(ctx,10)CGContextAddRect(ctx,rectangle)CGContextDrawPath(ctx,.FillStroke)UIGraphicsEndImageContext()//newway,Swift3ifletctx=UIGraphicsGetCurrentContext()CGRectangle(x矩形=0,y:0,width:512,height:512)ctx.setFillColor(UIColor.blue().cgColor)ctx.setStrokeColor(UIColor.white().cgColor)ctx.setLineWidth(10)ctx.addRect(矩形)ctx.drawPath(using:.fillStroke)UIGraphicsEndImageContext()}枚举类型中的大写Swift3中的枚举表达式使用小驼峰式(lowerCamelCase,即第一个单词的第一个字符为小写,而第一个单词的首字母为小写每个后续单词大写)表达式,可以使其与其他属性(或值)一致(SE-0006)://注意:下面代码第一行是Swift2的方法,后面是Swift3新写的方法UIInterfaceOrientationMask。LandscapeUIInterfaceOrientationMask.landscapeNSTextAlignment.RightNSTextAlignment.rightSKBlendMode.MultiplySKBlendMode.multiply今天大camelCase只有虽然可能需要一点时间来适应这一点,但Swift开发团队确实很努力地确保整体表达尽可能一致。方法命名的变化标准库在方法命名方面也变得更加一致。一般的建议是您应该根据方法的作用或行为来命名您的方法。经验法则是,如果方法包含“-ed”或“-ing”等后缀,则该方法被认为是名义上的。标称方法返回一个值。如果该方法没有后缀,则很可能是命令式动词方法。这些“动词”方法对引用的内存执行操作;这也称为就地修改。标准库(SE-0006)中存在几对遵循此名词/动词约定的方法。下面是其中的几个:实际用法:varages=[21,10,2]//variable,notconstant,soyoucanmodifyitages.sort()//modifiedinplace,valuenow[2,10,21]for(index,age)inages.enumerated(){//"-ed"nounreturnssacopyprint("\(index).\(age)")//1.2\n2.10\n3.21}函数类型函数声明和函数调用一直需要使用括号将其参数括起来环绕:funcf(a:Int){...}f(5)然而,当你使用函数类型作为参数时,你可以在Swift2中这样写:funcg(a:Int->Int)->Int->Int{...}//oldway,Swift2你可能已经注意到这个表达式有点难以理解。参数部分将在哪里结束?返回类型从哪里开始?在Swift3中定义上述函数的语法表达如下(SE-0066):funcg(a:(Int)->Int)->(Int)->Int{...}//newway,Swift3Now,您会注意到参数列表被圆括号括起来,后面是返回类型。这个表达很清楚;当然,函数类型也更容易识别。下面的小例子提供了更强的比较://oldway,Swift2Int->FloatString->IntT->UInt->Float->String//newway,Swift3(Int)->Float(String)->Int(T)->U(Int)->(Float)->StringAPIextension虽然Swift3最大的更新点主要集中在现有API的现代化上,但是仍然有很多Swift社区在这方面努力工作,并且针对SwiftAPI提供了许多非常有用的扩展。访问容器类型当你定义一个静态属性或方法时,你经常会像这样调用它:方法。为了使这个操作更清楚,您现在可以调用Self来获取容器类型。这里大写的Self代表self的类型,而小写的self代表self的实例。下面的代码展示了它是如何工作的(SE-0068):/oninstanceofthetype内联序列sequence(first:next:)和sequence(state:next:)都是可以返回无限序列的全局函数。如果您给它们一个初始值和一个可变状态,它们将自动应用闭包(SE-0094)。例如:forviewinsequence(first:someView,next:{$0.superview}){//someView,someView.superview,someView.superview.superview,...}当然也可以使用prefix来约束序列(SE-0045),例如:forxinsequence(first:0.1,next:{$0*2}).prefix(while:{$0<4}){//0.1,0.2,0.4,0.8,1.6,3.2}其他l#keyPath()的工作方式类似于#sselector(),将帮助程序员快速纠正强类型API中的拼写错误。l现在你可以像这样使用pi:Float.pi,CGFloat.pi。大多数情况下,编译器可以推断出对应的类型,例如:letcircumference=2*.pi*radius(SE-0067)l一些老式的基本类型去掉了NS前缀,现在可以直接使用Calendar和日期,而不是使用像NSCalendar和NSDate这样的形式。开发工具改进Swift是一种编程语言,因此编写Swift程序的很大一部分自然涉及到使用开发环境——对于Apple开发人员来说,这很可能是Xcode!开发环境工具的变化也会影响到你每天编写Swift代码的时间。Swift3进一步修复了编译器和IDE功能中的错误。此外,它还提高了报告错误和警告消息的准确性。正如你所预料的那样,Swift在每个版本中都变得越来越快,这与其运行和编译的方式密不可分:通过改进的字符串哈希将字符串字典速度提高3倍加速l通过将对象从堆存储移动到堆栈存储,在某些情况下快24倍l编译器现在可以一次缓存多个文件(在进行整个模块优化时)l代码大小优化技术大大减少了Swift代码的编译大小。例如苹果公司提供的著名演示程序Demobots(https://developer.apple.com/library/ios/samplecode/DemoBots/Introduction/Intro.html),经过代码优化技术处理,编译后的大小减小到原来77%另外,值得注意的是,今天的Xcode也在学习如何以原生Swift的方式“思考”:l以前,当你右键单击像sort()这样的API对象时,系统会跳转到它定义的地方,您将导航到一个神秘的头文件。在当前版本的Xcode8中,您会看到sort()作为数组的扩展对象,这正是您所期望的。lSwift的快照技术在其演变过程中很像Nightly版本。这提供了在完全集成到Xcode之前使用此新语法的机会。Xcode8支持在Playground中加载和运行Swift快照。Swift包管理器开源的Swift语言实际上是一个包的集合,包括语言、核心库和包管理器三部分。其中,Swift包管理器(PackageManager)为您想要共享和导入其他项目的任何Swift代码定义了一个简单的目录结构。与您可能习惯使用Cocoapods或Carthage等工具的包管理器类似,Swift的包管理器将下载依赖项、编译它们并链接它们以创建库和可执行文件。Swift3是第一个包含Swift包管理器的版本。现在有超过1,000个库支持它;在接下来的几个月中,您会看到更多的支持。计划中的未来功能如前所述,Swift3的目的是在推出新版本时保持您的代码向前兼容。虽然如此,但这个版本还有一些难以实现的地方,即通用技术的引入和应用程序二进制接口(ABI)的稳定。泛型的引入将包括递归协议约束以及对符合新协议的约束扩展的支持(例如,一组Equatable元素应该是Equatable等)。在这些功能完成之前,Swift无法确保ABI的稳定性。ABI稳定性将允许使用不同版本的Swift编译的应用程序和库链接在一起并相互交互。这是在第三方库不提供源代码的情况下启用框架迁移所必需的关键步骤,因为新版本的Swift要求这些第三方库不仅要更新它们的代码,还要重建它们的框架。此外,ABI稳定性将使Swift标准库不必附带二进制文件,而目前使用Xcode创建的iOS和macOS应用程序就是这种情况。当前的二进制文件与2MB的额外文件捆绑在一起,以确保它们在未来的操作系统上运行。现在总结一下,您现在可以让您的源代码从一个版本更改为另一个版本,但是尚未实现从一个版本到另一个版本的编译二进制兼容性。总结Swift将随着社区的最佳实践不断发展。尽管仍处于起步阶段,该语言已经取得了很大的成功,并预示着光明的未来。Swift已经在Linux上成功运行,在接下来的几年中,您可能会看到它不仅在设备上运行,而且在服务器上运行。从头开始设计语言肯定比打破ABI稳定性有其优势。这是一次绝无遗憾地改正语言的机会。Swift也在不断扩大其影响范围。Apple正在将Swift应用到自己产品的开发中。例如,Apple团队在iPad音乐应用程序开发、控制台开发、Sierra中的画中画开发、Xcode文档查看器和新的SwiftPlayground应用程序中广泛使用Swift语言。话说回来,非程序员学习Swift又掀起了一股大热潮,既是为了iPad开发,也是为了教育目的。今天的Swift正在崛起:更好的名字,更易读的代码,并且你有工具来帮助你迁移你的代码。如果您想更深入地了解Swift,可以查看WWDC会议记录(https://developer.apple.com/videos/wwdc2016/)。当Swift3于2016年底正式发布时,肯定会添加更多功能。我们将在此处构建所有更新,并继续关注新教程、书籍公告和相关视频发布。

最新推荐
猜你喜欢