Swift 3.1 改进了语言、包管理器和 Linux 实现

  • Sergio De Simone
  • 大愚若智

2017 年 4 月 4 日

话题:开源Linux移动AppleiOS语言 & 开发

在语言方面,Sequence协议新增了两个成员drop(while:)prefix(while:)。在特定谓词为 True 时,可通过丢弃或包含序列初始元素的方式返回所获得的子序列。因此如果有一个序列s,可通过执行下列命令获取其 n-th 到 m-th 子序列:

let subseq = s.prefix(while: {$0

Swift 3.1 还为所有数值类型增加了多个转换构造器(Conversion initializer),包括IntFloat,以及Double类型,借此可产生正确的结果,或返回nil。所谓的可失败构造器(Failable initializer)是为了更好地解决松散类型化数据的转换问题,例如 JSON 格式所包含的数据。借此所有数值类型获得了一个可以使用exactly关键字的全新构造器,例如:

init?(exactly value: Int64)

根据社区反馈,可失败的构造器是可抛出异常的构造器的首选做法。

虽然官方新闻稿中并未提及,但更新后的Apple Swift 3.1 指南文档中提到,类型扩展现已可包含泛型where子句:

extension Container where Item == Double {
    func average() -> Double {
        var sum = 0.0
        for index in 0..

以前,where子句只能用作将泛型约束给特定协议,这可能导致仅仅为了指定所需约束而引入 ad-hoc 协议:

extension Container where Item: MyConstrainProtocol {
...

在语言方面还有一个改动需要注意,Swift 3.1 对@available特性进行了扩展,可用于表达按照 Swift 不同版本指定的可用性,而以前只能按照语言和平台来指定可用性:

@available(swift, introduced: 3.0, obsoleted: 3.1)
class Foo {
  //...
}

借此开发者无须使用条件式编译即可判断函数、声明等的候补版本。

Swift 的 Linux 实现对现有的各种类进行了改进,包括NSDecimalURLSessionNSArrayNSData,同时改进了 JSON 序列化的性能,并在其他方面有诸多改进。

最后,Swift Package Manager 也提供了用户期待已久的很多功能,例如:

开源Linux移动AppleiOS语言 & 开发