Swift Digest
Blog | Swift.org Blog

Standard Library Preview パッケージ

Standard Library Preview Package

このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら

この記事の要点

何が発表されたのか

Standard Library Preview package は、Swift Evolution で受理済みだがまだ公式リリースに入っていない標準ライブラリ機能をまとめて提供するパッケージです。標準ライブラリは Swift 本体のリリースサイクルに縛られ、いったん出荷すると API を変更しづらいという制約があります。Preview package はこの間を埋め、受理された機能を実プロジェクトで試せるようにします。

発表時点では、SE-0270 の機能が初期コンテンツとして取り込まれています。新しい標準ライブラリ機能が受理されるたびに、Swift Evolution プロセスの一環として Preview package に追加されていきます。

何に使えるのか

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")]),
    ]
)

あとは import して、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]

入念なレビューを経た機能であっても、実利用に基づくフィードバックに代わるものはありません。Preview package は、API が公式リリースで固定される前にフィードバックを反映して改善する機会を作ります。

ソース安定性が必要な場合は個別パッケージを使う

Preview package は継続的に開発中で、ソース安定性を意図していないことを示すためメジャーバージョンを 0 に保っています。プロジェクトでソース安定性が必要な場合は、受理済みの各標準ライブラリ Proposal が個別の standalone パッケージとしても提供されています。Preview package は、これらの個別パッケージを再エクスポートするアンブレラライブラリとして実装されています。

たとえば SE-0270 は standalone パッケージ SE0270_RangeSet として利用できます。SE-0270 だけが必要なら、こちらを依存に追加します。

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")]),
    ]
)
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]

パッケージとして提案できるようになった

このパッケージの発表は、Swift Evolution プロセス自体の拡充も伴っています。従来どおり、標準ライブラリ機能の Proposal はレビュー開始前に完全な実装を含めることが求められます。しかし標準ライブラリの一部を変更するためだけに、LLVM・Clang・Swift コンパイラを含むスタック全体をビルドするのは、誰にとっても容易ではありません。

今後は、自分の実装を standalone な SwiftPM パッケージとして用意し、新設された Swift Evolution staging リポジトリにプルリクエストを送る形で提案できます。これにより、標準ライブラリへの貢献を妨げていた技術的ハードルの多くが取り除かれます。受理された Proposal は、公式の Swift リリースに含める前にフィードバックを集めるため、Standard Library Preview package の一部として提供されます。

関連リンク