Swift 3.1 发布!

Swift 3.1 现已正式发布!Swift 3.1 是一个次要版本,包含了对标准库的改进和优化。由于 IBM 和社区其他成员的努力,它还包括了对 Swift Linux 实现的许多更新。Swift Package Manager 也进行了一些更新。

语言更新

Swift 3.1 是一个次要语言版本。它与 Swift 3.0 源码兼容。它包含了以下语言变化和更新,其中大部分都经过了 Swift 演化过程

新的 Sequence 协议成员 Sequence 协议成员章节的永久链接" href="#new-sequence-protocol-members">

Sequence 协议现在有两个新成员

protocol Sequence {
  // ...
  /// Returns a subsequence by skipping elements while `predicate` returns
  /// `true` and returning the remainder.
  func drop(while predicate: (Self.Iterator.Element) throws -> Bool) rethrows -> Self.SubSequence
  /// Returns a subsequence containing the initial elements until `predicate`
  /// returns `false` and skipping the remainder.
  func prefix(while predicate: (Self.Iterator.Element) throws -> Bool) rethrows -> Self.SubSequence
}

更多信息请见:SE-0045: 向标准库添加 prefix(while:)drop(while:)

Swift 版本可用性

Swift 3.1 扩展了 @availability 属性,可以使用 Swift 的版本来指示声明的生命周期。例如,在 Swift 3.1 中移除的 API 将被写成:

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

更多信息请见:SE-0141: Swift 版本可用性

改进的数值转换初始化器

Swift 3.1 为所有数值类型添加了一系列新的转换初始化器,这些初始化器要么成功完成且不丢失信息,要么返回 nil。

更多信息请见:SE-0080: 可失败的数值转换初始化器

弃用和替换 UnsafeMutablePointer.initialize(from:)

接受 CollectionUnsafeMutablePointer.initialize(from:) 版本已被弃用,取而代之的是 UnsafeMutableBufferPointer 上的一个新方法,该方法接受 Sequence,目的是提高内存安全性,并能够更快地从序列初始化内存。

更多信息请见:SE-0147: 将 UnsafeMutablePointer.initialize(from:) 移动到 UnsafeMutableBufferPointer

Linux 实现的改进

Package Manager 更新

可编辑的包

默认情况下,包依赖项现在存储在工具管理的构建目录中,新的 swift package edit 命令允许用户“开始编辑”包,将其置于用户控制之下(放入 Packages 目录),免除其依赖项更新,并允许用户提交和推送对该包的更改。

更多信息请见:SE-0082: Package Manager 可编辑包

版本锁定

您使用的每个依赖项的版本现在都记录在一个 Package.pins 文件中,该文件可以被检入以与包的其他用户共享这些版本;swift package pinswift package unpin 命令提供了进一步的控制。swift package update 将重新解析为最新的允许依赖项版本并更新 pinfile,但默认情况下,在解析依赖项时会获取包依赖项的锁定版本。

更多信息请见:SE-0145: Package Manager 版本锁定

工具版本

包现在可以指定它们所需的最低 Swift 工具版本。可以使用 swift package tools-version 命令编辑此要求,并记录在 Package.swift 清单的顶部。依赖项解析将忽略需要比正在使用的 Swift 工具更新的包版本,因此包可以采用新的 Swift 功能,而不会破坏使用旧 Swift 工具的客户端。所需的最低工具版本决定了解释 Package.swift 清单时使用的 Swift 语言版本,以及可用的 PackageDescription API 版本。

更多信息请见:SE-0152: Package Manager 工具版本

Swift 语言兼容性版本

包现在可以指定其源代码是用 Swift 3 还是 Swift 4 语言版本编写的。如果未指定,则默认从包的最低 Swift 工具版本推断。

更多信息请见:SE-0151: Package Manager Swift 语言兼容性版本

Package Manager 的其他改进

Swift Package Manager 的文档可以在 仓库中找到。

迁移到 Swift 3.1

Swift 3.1 与 Swift 3.0 源代码兼容。为了帮助从 Swift 的早期版本迁移到 Swift 3.1,Xcode 8.3 包含一个代码迁移器,可以自动处理许多需要的源代码更改。 还有一个 迁移指南 可用于指导您完成许多更改,特别是那些不太机械化且需要更直接审查的更改。

文档

上提供了适用于 Swift 3.1 的 The Swift Programming Language 的更新版本。它也可以在 Apple 的 iBooks 商店中免费获得。

平台

Linux (Ubuntu 14.04、Ubuntu 16.04 和 Ubuntu 16.10)

Ubuntu 14.04、Ubuntu 16.04 和 Ubuntu 16.10 的官方二进制文件可供下载

Apple (Xcode)

对于 Apple 平台上的开发,Swift 3.1 作为 Xcode 8.3 的一部分发布。

来源

Swift 3.1 的开发在 GitHub 上以下存储库的 swift-3.1-branch 中进行跟踪

标记 swift-3.1-RELEASE 指定了这些存储库中构成 Swift 3.1 最终版本的特定修订版本。

swift-3.1-branch 将保持开放,但在相同的发布管理流程下,以累积未来潜在的错误修复“点”版本的更改。