Xcode 7 beta发布,Swift 2.0带来哪些新变化?

更新时间:2015-06-10 12:11:26 点击次数:1267次

WWDC 2015首日,苹果发布了版本号为7A120f的Xcode 7 beta,包含了Xcode IDE、Swift 2编译器、Instruments、模拟器和新的OS X、iOS、watchOS SDK。 


Xcode 7 beta Release Notes可以看出,Swift 2.0包含了许多非常niubility的特性,现在,在Swift中支持错误处理,如抛出(throw)、捕获(catch)、管理(manage)等,并且可以和NSError无缝交互。而当新的API需要向后兼容旧的系统版本时,如果当前API和将要部署的目标系统版本不一致,将会抛出一个编译时错误。而近来在TIOBE编程语言排行榜呈现“自由落体”趋势的Objective-C也有着两处修改。具体更新如下: 

Swift 2.0和Objective-C的更新


  • 错误处理:我们可以在Swift中构建一个函数用来抛出,捕获和管理错误。我们可以接触和处理可恢复的错误,如“file-not-found”或者网络超时,Swift和错误处理可以和NSError无缝交互。

  • 可用性检查:如果你在一个旧的部署平台上调用的一个新的系统版本引入的API时将触发一个编译时错误。我们可以在if或者guard条件语句中使用#available()函数来检查API函数的可用性:例如:



  • [cpp] view plaincopy

    1. if #available(iOS 8.0, OSX 10.10, *) {  

    2.  // 当版本匹配时使用Handoff APIs.  

    3.  let activity =  

    4.  NSUserActivity(activityType:"com.example.ShoppingList.view")  

    5.  activity.becomeCurrent()  

    6. else {  

    7.  //当版本不匹配时返回.  

    8. }   



  • 你可以在你的代码声明中使用@available()属性声明来指定可用性信息。 例如:



  • [cpp] view plaincopy

    1. @available(iOS 8.0, OSX 10.10, *)  

    2. func startUserActivity() -> NSUserActivity {  

    3.  ...  

    4. }   


    指示startUserActivity()方法只在iOS8.0+,OSX10.10+以及以其他平台的全版本可用。


  • 协议的扩展性:现在可以为协议类型编写扩展,这样就可以为遵循该协议的任意类增加方法或者属性,极大重用我们的代码。

  • 协议默认实现:现在可以为协议扩展中指定的需求提供一个默认实现,这样便可以使用诸如“mixin”和“trait”的模式。

  • 新的defer语句:这个语句在代码生命周期结束时用来做清理的工作,该特性在并发开发时使用新的错误处理模型时非常有用。例如:



  • [cpp] view plaincopy

    1.  let f = fopen("x.txt""r")  

    2.  defer { fclose(f) }  

    3.  try foo(f) // f会关闭如果错误产生的话.  

    4.  let f2 = fopen("y.txt""r")  

    5.  defer { fclose(f2) }  

    6.  try bar(f, f2) // 如果错误产生f2关闭,接着f关闭。  

    7. // f2关闭, 如果没有任何错误产生f关闭。  



  • 新的guard语法:这个新的语法允许你在一个代码周期中构建一个提前的退出点。例如:



  • [cpp] view plaincopy

    1. guard let z = bar() else { return }  

    这里的else语句被用于退出代码块(和return、throw、break、continue等类似),或者终止调用一个@noreturn属性修饰的函数。



  • 增强化的模式匹配:switch/case的模式匹配现在在很多新的条件流程控制语句中可用,这包括if/case,while/case,guard/case和for-in/case、for/in,同时也允许使用“where”判断。

  • 新的do语句:在do语句中支持代码块嵌套,例如:



  • [cpp] view plaincopy

    1. do {  

    2.  //new scope  

    3.  do {  

    4.  //another scope  

    5.  }  

    6. }  



  • 可测试性:关于Swift2.0框架和App的测试现在不需要将内部功能代码路由到public代码了。在待测试代码中使用@testable import {ModuleName}语法使所有的内部私有和public出来的代码可用。App或者framework的target在编译时需要启用“Enable Testability”编译设置。这个“Enable Testability”编译属性只能在Debug配置中可用,因为它需要导出内部符号信息从而妨碍代码优化。

  • 对C函数指针的支持:以函数指针作为函数参数的C函数将会使用闭包或者全局的函数的方式调用,由于这个限制,所以闭包不能捕获其上下文环境。例如,标准C库函数qsort将会按照如下方式调用:



  • [cpp] view plaincopy

    1. var array = [3, 14, 15, 9, 2, 6, 5]  

    2. qsort(&array, array.count, sizeofValue(array[0])) { a, b in  

    3.  return Int32(UnsafePointer<Int>(a).memory - UnsafePointer<Int>(b).memory)  

    4. }  

    5. print(array)  



  • 增强的诊断信息:增加了一个新的警告信息用来在尽可能的情况下鼓励使用let而不是var。同时也增加了新的警告信息来提示未使用的变量,无法触发的switch case分支判断等,同时对于switch语句耗尽的判断更加智能。

  • SIMD支持:Clang中扩展的矩阵算法在swift中可以导入并使用了,大数据量的图形算法或者其他系统级别的数据运算在Swift实现成为可能。

  • 枚举中现在支持多泛型关联值,例如:



  • [cpp] view plaincopy

    1. enum Either<T, U> {  

    2.  case Left(T), Right(U)  

    3. }  



  • 打印特定枚举类型值时现在可以显示枚举值和附带的值了,但是这个对于@objc类型的枚举类型或者含有多附带值的枚举类型不支持。

  • 现在允许对泛型类型编写公共扩展(Public)了。例如:



  • [cpp] view plaincopy

    1. public extension Array { … }  



  • 非泛型的类可以继承自泛型的类了。

  • Swift字符串字面量的拼接,包括跨行文本,现在确保能够进行编译时优化。

  • 可失败便捷构造器现在允许在调用self.init前调用return nil语句。指定构造器在返回nil之前必须初始化所有的存储属性,这是一个已知的限制。

  • 内嵌函数现在可以递归引用函数本身或者其他的内嵌函数。

  • if条件语句现在支持标签化了,可以使用break去跳出一个标签化的if判断。注意不带标签的break语句只能使用在循环或者switch/case语句中而不能用在if中。

  • 一个新的x?语句用来匹配可选类型。

  • 一个新的@nonobjc属性用来选择性的禁止实例的导出,这个和@objc相对应。

  • 在标准库中增加了一个新的函数:readLine()


  • Playground


  • 富文本注释:采用Markdown样式的语法来解释代码的功能。

  • 内联结果:在代码的下方直接显示代码的输出的结果。

  • 资源:允许使用项目导航器面板向Playground中增加诸如图片一样的资源。

  • 辅助代码:在Playground本身之外保留额外的代码用作辅助功能。

  • 分页:采用Bundle类似的方式来组织Playground结构。


  • 本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

    回到顶部
    嘿,我来帮您!