この記事の要点
- シーケンスとコレクションを対象としたアルゴリズム群と関連する型をまとめた新しいオープンソースパッケージ Swift Algorithms(swift-algorithms)が発表されました。他言語でよく見られる汎用アルゴリズムを取り込み、読みづらく間違えやすい生のループを置き換えることを目指しています。
- 組み合わせ・順列・ランダムサンプリング・コレクションの分割(chunk)など、汎用的な操作が初期セットとして含まれています。
- このパッケージは標準ライブラリへ機能を取り込む前段の実験場として位置づけられており、関連するアルゴリズム群を試しながら設計を磨き、最終的に標準ライブラリへ昇格させることが狙いです。
何が発表されたのか
Swift Algorithms は、Sequence と Collection を対象とした汎用アルゴリズムと、それに関連する型を提供するパッケージです。アルゴリズムは、読みづらく間違いの混入しやすい生のループをカプセル化してくれる強力な道具です。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)といった操作が含まれ、それぞれリポジトリ内のガイドで詳しく解説されています。
パッケージへの収録基準
このパッケージが当面の対象とするのは、Sequence や Collection の系列のプロトコルに対して汎用化された、実用的なアルゴリズムです。逆に、次のようなものは対象外とされています。
Resultのような currency 型やOrderedDictionaryのようなデータ構造SequenceやCollectionに対して汎用化されない一回限りの便利機能(Dictionary.subscript(key:default:)など)- より実用的な代替がある古典的アルゴリズム(クイックソートやマージソートなど)
- 線形でないデータ構造に対するアルゴリズム
収録を検討する際は、可読性を高めるか、よく使う操作か、既存の抽象と一貫しているか、正しさや性能の落とし穴を避ける助けになるか、といった観点で評価されます。一方で、!isEmpty のように自明に組み合わせられるものや、誤用を招きかねないものは避けられます。
標準ライブラリとの関係・今後の位置づけ
発表時点で示されていた今後の構想であり、実現を約束するものではありません。
標準ライブラリには、豊富で実用的な汎用アルゴリズムを備えさせたいという狙いがあります。Swift Algorithms は、Swift Numerics と同様に、関連するアルゴリズム群を低コストに作り込み、実利用に基づくフィードバックを集めながら設計を磨く場として機能します。そうして練られたものを、最終的に標準ライブラリへ昇格させることが目指されています。
このパッケージは、長期に及んだ SE-0270 のレビューと、それに続く Swift Evolution プロセスの議論への応答でもあります。SE-0270 では、フォーラムでの議論に適した小ささと、追加内容の一貫性を示すのに十分な大きさとの間で緊張がありました。今後は、関連するアルゴリズム群を複数の小さな Proposal に分割し、Algorithms パッケージの存在を背景情報として活用していく方針が示されています。ただしこれは Swift Evolution プロセス自体の変更ではなく、十分に練られた pitch はこれまでどおり検討されます。
Swift Algorithms は完全なオープンソースプロジェクトで、GitHub 上で開発されています。議論は Swift フォーラムの Algorithms カテゴリで行えます。