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

Posted CSDN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode 6.3 Beta发布,Swift 1.2带来哪些新变化?相关的知识,希望对你有一定的参考价值。

北京时间2月10日,苹果在面向开发者推送ios 8.3 Beta的同时,还发布了版本号为6D520o的Xcode 6.3 Beta,其中便包含了iOS 8.3 Beta和OS X v10.10 SDK,并进一步提升了Swift与Objective-C代码的交互性,而Swift业已更新至1.2版本。


从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语句现在被扩展为可以支持多条条件判断:


if let a = foo(), b = bar() where a < b,

let c = baz() {

}


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


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


let x: SomeThing

if condition {

x = foo()

} else {

x = bar()

}

use(x)


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


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

  • 对于表达式闭包的类型引用有了几点改进:


  1. 含有单返回语句的闭包现在类型检查时以单表达式闭包处理。

  2. 匿名的且含有非空返回类型的单表达式现在可以用在Void上下文中。

  3. 多表达式的闭包类型的情况可能无法被类型推断出来,这归功于缺乏返回类型的情况能被正确的推断出来。


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


@objc

enum Bear: Int {

case Black, Grizzly, Polar

}<br>


导出到Objective-C:


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,例如:


import Darwin

var devNullStat = stat()

stat("/dev/null", &devNullStat)


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


  • String的索引类型间新的转换API现在可以用了,如String、String.UnicodeScalarView、String.UTF16View以及String.UTF8View, 同时每个String View转换为String的函数也可使用。

  • 类型值在println函数或者字符串内插算法中现在可以打印完整的类型名称了:


toString(Int.self) // 打印 “Swift.Int"

println([Float].self) // 打印 "Swift.Array<Swift.Float>”

println((Int, String).self) // 打印 "(Swift.Int, Swift.String)"


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


func autoreleasepool(@noescape code: () -> ()) {

pushAutoreleasePool()

code()

popAutoreleasePool()

}


  • 相比Swift 1.1,Swift 1.2在很多方面的性能上有本质的提高,比如多维数组算法更快,未优化的代码更加快速。

  • 表达式类型的错误诊断有了很大的提高。

  • 很多通用表达式的检查效率有很大提高,这个有助于降低编译时间和减少“expression too complex”的错误。



点击“阅读原文”可查看全文并参与讨论。


以上是关于Xcode 6.3 Beta发布,Swift 1.2带来哪些新变化?的主要内容,如果未能解决你的问题,请参考以下文章

swift 1.2 / xcode 6.3 更新后未调用获取的结果控制器委托

如何在 Swift(Xcode 6.3)中翻转标签(获取镜像视图)

在 Xcode 6.3 (Swift) 中使用 Parse 和 Facebook 框架编译错误

Clang:错误:链接器命令失败,退出代码 1(使用 -v 查看调用)Xcode 10、Xcode 10.1 Beta、Swift 4.2

从 Xcode 6.3 上传的存档的 iTunes Connect 错误:包含无效的 Swift 版本

Xcode 8 beta 6 swift 3 本地化CaseInsensitiveCompare