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:)
接受 Collection 的 UnsafeMutablePointer.initialize(from:) 版本已被弃用,取而代之的是 UnsafeMutableBufferPointer 上的一个新方法,该方法接受 Sequence,目的是提高内存安全性,并能够更快地从序列初始化内存。
更多信息请见:SE-0147: 将 UnsafeMutablePointer.initialize(from:) 移动到 UnsafeMutableBufferPointer
Linux 实现的改进
NSDecimal的实现NSLengthFormatter的实现Progress的实现URLSession功能的许多改进,包括 API 覆盖和libdispatch的优化使用NSArray、NSAttributedString和许多其他类中改进的 API 覆盖Data的显著性能改进。在此处查看更多详细信息- 改进的 JSON 序列化性能
- 修复了
NSUUID、NSURLComponents和其他类中的内存泄漏 - 改进的测试覆盖率,尤其是在
URLSession中
Package Manager 更新
可编辑的包
默认情况下,包依赖项现在存储在工具管理的构建目录中,新的 swift package edit 命令允许用户“开始编辑”包,将其置于用户控制之下(放入 Packages 目录),免除其依赖项更新,并允许用户提交和推送对该包的更改。
更多信息请见:SE-0082: Package Manager 可编辑包
版本锁定
您使用的每个依赖项的版本现在都记录在一个 Package.pins 文件中,该文件可以被检入以与包的其他用户共享这些版本;swift package pin 和 swift 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 test现在支持使用--parallel标志并行运行测试。swift build、swift test和所有解析依赖项的swift package命令现在都支持使用--enable-prefetching标志并行获取这些依赖项。
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
- swift-llvm
- swift-clang
- swift-lldb
- swift-cmark
- swift-corelibs-foundation
- swift-corelibs-libdispatch
- swift-corelibs-xctest
- swift-llbuild
- swift-package-manager
- swift-xcode-playground-support
- swift-compiler-rt
标记 swift-3.1-RELEASE 指定了这些存储库中构成 Swift 3.1 最终版本的特定修订版本。
swift-3.1-branch 将保持开放,但在相同的发布管理流程下,以累积未来潜在的错误修复“点”版本的更改。