Apple
最近新开源了一个项目,命名为 Standard Library Preview Package
,主要是用来加强 Swift Evolution
进程的。该 Preview Package
将包含已被纳入 Swift Standard Library
计划但还没被集成到 Swift 正式版中的功能。这可以使得我们在真实环境中使用这些新特性,并给予及时的反馈,同时也降低了给 Standard Library
贡献代码的技术门槛。
Preview Package
最近接收了 SE-0270
提议,该提议实现了获取一个集合的子集,比如 subranges(where:)
和 moveSubranges(_:to:)
。
使用 Preview Package
想在 Swift Package Manager
项目中使用 Standard Library Preview Package
,只需要编辑 Package.swift
文件即可。
let package = Package(
name: "MyPackage",
dependencies: [
.package(url: "https://github.com/apple/swift-standard-library-preview.git", from: "0.0.1"),
],
targets: [
.target(
name: "MyTarget",
dependencies: [.product(name: "StandardLibraryPreview", package: "swift-standard-library-preview")]),
]
)
使用 SE-0270
提议的新特性:
import StandardLibraryPreview
var numbers = [10, 12, -5, 14, -3, -9, 15]
let negatives = numbers.subranges(where: { $0 < 0 })
// numbers[negatives].count == 3
numbers.moveSubranges(negatives, to: 0)
// numbers == [-5, -3, -9, 10, 12, 14, 15]
所有纳入 Standard Library
中的提议,都将会在 Preview Package
中先实现,然后获得真实环境中的使用反馈,这样可以及时发现问题。
使用独立的 Package
Standard Library Preview package
正在持续进行开发中,主版本为 0
意味着源码还不是稳定的。如果你想求稳,可以使用独立的 package。
比如拿 SE-0270
来说,它有一个独立的 package
SE0270_RangeSet。如果只想要 SE-0270
提议中的特性的话,只需要如下编辑 Package.swift
即可。
let package = Package(
name: "MyPackage",
dependencies: [
.package(url: "https://github.com/apple/swift-se0270-range-set.git", from: "1.0.0"),
],
targets: [
.target(
name: "MyTarget",
dependencies: [.product(name: "SE0270_RangeSet", package: "swift-se0270-range-set")]),
]
)
导入对应的 package
:
import SE0270_RangeSet
var numbers = [10, 12, -5, 14, -3, -9, 15]
let negatives = numbers.subranges(where: { $0 < 0 })
// numbers[negatives].count == 3
numbers.moveSubranges(negatives, to: 0)
// numbers == [-5, -3, -9, 10, 12, 14, 15]
总结
以前一个提议被 review
之前,需要先提供完整的代码实现。但这提高了大家贡献代码的技术门槛,因为可能还会涉及到 LLVM
、CLang
和 Swift 编译器
等相关的项目。
有了 Preview Package
后,一方面可以降低大家贡献代码的门槛,另一方面也能及时获取到在真实环境中的使用反馈。