Swift Digest
Blog | Swift.org Blog

Swift Algorithms の発表

Announcing Swift Algorithms

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

この記事の要点

何が発表されたのか

Swift Algorithms は、SequenceCollection を対象とした汎用アルゴリズムと、それに関連する型を提供するパッケージです。アルゴリズムは、読みづらく間違いの混入しやすい生のループをカプセル化してくれる強力な道具です。Python の itertools や C++ の algorithms ライブラリにあたるような、他言語で広く使われている汎用アルゴリズムを Swift にもたらし、コードの正しさと性能の向上に役立てることが意図されています。

何に使えるのか

初期セットには、コレクションの要素を循環させる、組み合わせや順列を求める、ランダムサンプルを作る、といった操作が含まれます。

たとえば chunked メソッドは、コレクションを連続した部分シーケンスへ分割します。隣り合う要素を比較して分割点を見つける版を使うと、配列を昇順に続く区間ごとに素早く切り分けられます。

let numbers = [10, 20, 30, 10, 40, 40, 10, 20]
let chunks = numbers.chunked(by: { $0 <= $1 })
// [[10, 20, 30], [10, 40, 40], [10, 20]]

もう一方の版は、各要素を変換した値の変化を見て分割します。名前のリストを先頭の文字ごとにグループ化する、といった用途に使えます。

let names = ["Cassie", "Chloe", "Jasmine", "Jordan", "Taylor"]
let chunks = names.chunked(on: \.first)
// [["Cassie", "Chloe"], ["Jasmine", "Jordan"], ["Taylor"]]

このほか、組み合わせ(Combinations)、順列(Permutations)、直積(Product)、連結(Chain)、循環(Cycle)、重複除去(Unique)、ランダムサンプリング(Random Sampling)、インデックス付き列挙(Indexed)、分割(Partition)、回転(Rotate)といった操作が含まれ、それぞれリポジトリ内のガイドで詳しく解説されています。

パッケージへの収録基準

このパッケージが当面の対象とするのは、SequenceCollection の系列のプロトコルに対して汎用化された、実用的なアルゴリズムです。逆に、次のようなものは対象外とされています。

収録を検討する際は、可読性を高めるか、よく使う操作か、既存の抽象と一貫しているか、正しさや性能の落とし穴を避ける助けになるか、といった観点で評価されます。一方で、!isEmpty のように自明に組み合わせられるものや、誤用を招きかねないものは避けられます。

標準ライブラリとの関係・今後の位置づけ

発表時点で示されていた今後の構想であり、実現を約束するものではありません。

標準ライブラリには、豊富で実用的な汎用アルゴリズムを備えさせたいという狙いがあります。Swift Algorithms は、Swift Numerics と同様に、関連するアルゴリズム群を低コストに作り込み、実利用に基づくフィードバックを集めながら設計を磨く場として機能します。そうして練られたものを、最終的に標準ライブラリへ昇格させることが目指されています。

このパッケージは、長期に及んだ SE-0270 のレビューと、それに続く Swift Evolution プロセスの議論への応答でもあります。SE-0270 では、フォーラムでの議論に適した小ささと、追加内容の一貫性を示すのに十分な大きさとの間で緊張がありました。今後は、関連するアルゴリズム群を複数の小さな Proposal に分割し、Algorithms パッケージの存在を背景情報として活用していく方針が示されています。ただしこれは Swift Evolution プロセス自体の変更ではなく、十分に練られた pitch はこれまでどおり検討されます。

Swift Algorithms は完全なオープンソースプロジェクトで、GitHub 上で開発されています。議論は Swift フォーラムの Algorithms カテゴリで行えます。

関連リンク