この記事の要点
- 新しいオープンソースパッケージ Standard Library Preview package(swift-standard-library-preview)が発表されました。Swift Evolution で受理されたものの、まだ公式の Swift リリースには含まれていない標準ライブラリの新機能を、一足先に利用できるようにするパッケージです。
- 実利用に基づくフィードバックを、API が公式リリースで固定される前に集めることが狙いです。これにより、標準ライブラリへの貢献を妨げていた技術的ハードルの多くも取り除かれます。
- 第 1 弾として、SE-0270 で受理された機能(
RangeSet型と、subranges(where:)/moveSubranges(_:to:)などのコレクション操作)が同梱されました。Preview package 自体も SE-0264 として Swift Evolution プロセスを経たものです。
何が発表されたのか
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 の一部として提供されます。