标准库预览包

我很高兴地宣布一个新的开源软件包以及对 Swift 演进过程的增强:标准库预览包! 预览包提供了对已通过 Swift 演进过程被 Swift 标准库接受,但尚未作为官方 Swift 版本一部分发布的功能的访问权限。 这将使我们能够采纳来自真实世界使用情况的反馈,并消除许多为标准库做贡献的技术障碍。

我们已经在预览包中加入了最近批准的 SE-0270 提案中的功能,其中包括对集合子范围的操作,例如 subranges(where:)moveSubranges(_:to:),以及支持的 RangeSet 类型。

注意:标准库预览包本身就是 Swift 演进过程的产物! 有关更多信息,包括纳入预览包的标准,请参阅 SE-0264

使用预览包

要在 Swift Package Manager 项目中使用标准库预览包,请将其作为包依赖项和目标依赖项添加到您的 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]

随着标准库的新增内容获得批准,它们将作为 Swift 演进过程的一部分添加到预览包中。

尽管所有新增内容都经过彻底的审查,但没有什么可以替代来自真实世界使用情况的反馈。 有时我们会发现 API 不如它可能的那样好。 预览包将通过创造反馈机会,在 API 被锁定并在官方 Swift 版本中发布之前进行更改,从而帮助我们解决此类发现。

使用独立包

标准库预览包正在持续开发中,并保持主版本 0,以表明它不旨在实现源代码稳定性。 如果您的项目需要源代码稳定性,则每个批准的标准库提案也可以作为独立包提供。 预览包实际上是一个伞状库,它重新导出每个单独的包。

例如,SE-0270 的功能可以作为独立的 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")]),
    ]
)

… 并仅导入 SE-0270

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]

以包的形式提案

我们要求每个标准库功能提案在审查过程开始之前都包含完整的实现。 然而,我们意识到并非每个人都有时间和资源来构建整个堆栈(包括 LLVM、Clang 和 Swift 编译器),仅仅为了更改标准库的一部分。

展望未来,您可以通过针对新的 Swift Evolution staging 存储库打开拉取请求,以独立的 SwiftPM 包形式提供您的实现。 这种更平易近人的功能提案方式应消除许多为标准库做贡献的技术障碍。

一旦提案获得批准,它将作为标准库预览包的一部分提供,以便在包含在官方 Swift 版本中之前收集反馈。

参与进来!

如果您有兴趣参与审查过程并确定 Swift 的发展方向,请访问 Swift 论坛的“演进”部分。 欢迎所有人提出、讨论和审查改进 Swift 语言和标准库的想法!

有疑问?

请随时在 Swift 论坛的相关主题帖中发布关于这篇文章的问题。