Xcode 6.3 Beta发布,Swift 1.2带来哪些新变化

大哥大姐有没有人讲详细点的,我想教下,Xcode 6.3 Beta发布,Swift 1.2带来哪些新变化
最新回答
清几何

2024-09-07 00:16:56

  从Xcode 6.3 Beta Release Notes看出,Xcode 6.3 Beta包含了很多颇为值得开发者期待的改变,共计50多处改动,同时修改了Objective-C的语法,足见苹果对Swift语言的重视。而其代码迁移工具可以帮助开发者将其代码从Swift 1.1(Xcode 6.1)升级至Swift 1.2(Xcode 6.3),具体执行编辑菜单(Edit)->转换(Convert)-至(To)Swift1.2即可。 具体更新如下:

  Swift语言的增强

  Swift现在支持目标增量编译,例如当一个文件改变时不会重新编译Target中的每一个文件。这个基于固有依赖分析。所以你依然会看到有很多文件在必要情况下被重编。如果你发现需要重编但没有重编的情况,请报一个Bug出来。清理Target后再编,会按照往常的流程进行。
  增加了一个新的Set数据类型,它提供了元素唯一化,且有完整语义的通用数据类型集合。它和NSSet类型桥接,提供和Array和Dictionary相类似的功能。
  if let语句现在被扩展为可以支持多条条件判断:

  [cpp] view plaincopy
  if let a = foo(), b = bar() where a < b,
  let c = baz() {
  }

  它允许你测试多种选择,并且包含一个bool判断。当然这种情况不包含嵌套判断。

  let常量现在生成时不需要立即初始化,新的规则是let常量必须在被首次使用前初始化即可(和var一样)。或者说它只能被初始化,也就是说在初始化后它不能再被改变或者重新赋值,可用的模式如下:

  [cpp] view plaincopy
  let x: SomeThing
  if condition {
  x = foo()
  } else {
  x = bar()
  }
  use(x)

  这个正常的来说需要var变量用法,尽管这里没有任何修改的操作。

  "Static"静态方法和属性现在允许在class中使用(作为“class final”的别名)。你现在可以在类中声明一个静态存储属性,它享有全局存储空间和首次使用再初始化的惰性构造功能。协议Protocal现在会声明一个static的类型要求而不是声明一个class的要求。
  对于表达式闭包的类型引用有了几点改进:

  含有单返回语句的闭包现在类型检查时以单表达式闭包处理。
  匿名的且含有非空返回类型的单表达式现在可以用在Void上下文中。
  多表达式的闭包类型的情况可能无法被类型推断出来,这归功于缺乏返回类型的情况能被正确的推断出来。

  Swift中的枚举类型现在可以通过@objc关键字导出到Objective-C中。@objc的枚举类型必须定义一个整型的原始类型,并且该枚举不能泛型化或者不能使用关联值。由于Objective-C中的枚举类型没有命名空间,所以导出到Objective-C中的枚举类型以枚举名字和case项目名字的组合的方式使用。 比如在Swift中的声明:

  [cpp] view plaincopy
  @objc
  enum Bear: Int {
  case Black, Grizzly, Polar
  }<br>

  导出到Objective-C:

  [cpp] view plaincopy
  typedef NS_ENUM(NSInteger, Bear) {
  BearBlack, BearGrizzly, BearPolar
  };

  Objective-C语言的扩展语法现在可以判断出Objective-C API中指针或者block的是否为空,同时允许不带ImplicitlyUnwrappedOptional协议地导出Objective-C API函数。
  Swift现在可以部分支持导入C的联合类型,包括unions、bitfileds、SIMD vector类型以及其他Swift的不支持的C特性。这些不被支持的元素不能在Swift中的直接访问,但是在Swift中,Objective-C或者C可以以参数或者返回类型的方式使用。这包括Foundation NSDecimal类型、GLKit GLKVector和GLKMatrix类型,以及其他一些类型。
  被导入的C结构体现在在Swift中有一个默认的构造器,它会将结构体中的所有的元素初始化为0,例如:

  [cpp] view plaincopy
  import Darwin
  var devNullStat = stat()
  stat("/dev/null", &devNullStat)

  如果一个结构体的元素不能被正确的初始化为0(比如被标记为新的_nonnull标示符时),这个默认的构造器将会终止。

  String的索引类型间新的转换API现在可以用了,如String、String.UnicodeScalarView、String.UTF16View以及String.UTF8View, 同时每个String View转换为String的函数也可使用。
  类型值在println函数或者字符串内插算法中现在可以打印完整的类型名称了:

  [cpp] view plaincopy
  toString(Int.self) // 打印 “Swift.Int"
  println([Float].self) // 打印 "Swift.Array<Swift.Float>”
  println((Int, String).self) // 打印 "(Swift.Int, Swift.String)"

  一个新的“@noescape”属性可以用在函数的闭包参数上,这意味着这个参数是唯一可被调用的(或者用在函数调用时以参数的方式出现),其意思是它的生命周期比函数调用的周期短,这有助于一些小小的性能优化,但最重要的是它屏蔽了闭包中对self.的需求。这使得函数的控制流比其他更加透明。在未来的beta版本中,标准库函数将普遍采用这种特性,比如autoreleasepool():

  [cpp] view plaincopy
  func autoreleasepool(@noescape code: () -> ()) {
  pushAutoreleasePool()
  code()
  popAutoreleasePool()
  }

  相比Swift 1.1,Swift 1.2在很多方面的性能上有本质的提高,比如多维数组算法更快,未优化的代码更加快速。
  表达式类型的错误诊断有了很大的提高。
  很多通用表达式的检查效率有很大提高,这个有助于降低编译时间和减少“expression too complex”的错误。