Swift Algorithmsとは 2020年にAppleが公開したオープンソースパッケージで、順序とコレクションに関する便利なアルゴリズムを提供してくれます。
Announcing Swift Algorithms
I’m excited to announce Swift Algorithms, a new open-source package of sequence and collection algorithms, along with their related types.
利用するにはSwift Package Managerで https://github.com/apple/swift-algorithms をプロジェクトに追加し、使用したいファイルにimport Algorithms
を追記してください。
できること
前回に引き続き、このパッケージでできることを説明していきます。
Product
2つの異なるコレクションのすべての要素のペアを反復する関数です。for文のなかでfor文を回すようなことをする必要がなくなります。
let seasons = ["春", "夏", "秋", "冬"]
for (year, season) in product(1990...2023, seasons) {
print("\(year)年\(season)")
}
// 1990年春
// 1990年夏
// 1990年秋
// 1990年冬
// 1991年春
// 1991年夏
// 1991年秋
// 1991年冬
...
// 2023年春
// 2023年夏
// 2023年秋
// 2023年冬
いずれかのコレクションが空の場合、結果のラッパーコレクションも空になります。
Chunked
chunked
メソッドには、chunked(by:)
とchunked(on:)
の2つのバリエーションがあります。
chunked(by:)
は、バイナリ述語を使用して連続した要素をテストし、述語がfalse
返すチャンクを分離します。
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]]
chunked(on:)
メソッドは、各要素の射影を取り、2つの連続した要素の射影が等しくないチャンクを分離します。
let names = ["David", "Kyle", "Karoy", "Nate"]
let chunks = names.chunked(on: \.first!)
// [("D", ["David"]), ("K", ["Kyle", "Karoy"]), ("N", ["Nate"])]
chunks(ofCount:)
メソッドは、count
パラメータ(ゼロより大きい)を受け取り、コレクションをこの指定されたcountのチャンクに分離します。
let names = ["David", "Kyle", "Karoy", "Nate"]
let evenly = names.chunks(ofCount: 2)
// equivalent to [["David", "Kyle"], ["Karoy", "Nate"]]
let remaining = names.chunks(ofCount: 3)
// equivalent to [["David", "Kyle", "Karoy"], ["Nate"]]
Chain
同じ要素タイプの2つのコレクションを次々に連結します。
let numbers = chain([10, 20, 30], 1...5)
// Array(numbers) == [10, 20, 30, 1, 2, 3, 4, 5]
let letters = chain("abcde", "FGHIJ")
// String(letters) == "abcdeFGHIJ"
join()とは違って異なるコレクション型が許容されるのが特徴。
Cycle
コレクションを永遠に、または一定回数反復します。
for (odd, n) in zip([true, false].cycled(), 1...) {
// ...
}
for x in (1...3).cycled(times: 3) {
print(x)
}
// 1~3を3回プリントする
Unique
シーケンスまたはコレクションから重複する要素を取り除きます。
let numbers = [1, 2, 3, 3, 2, 3, 3, 2, 2, 2, 1]
let unique = numbers.uniqued()
// Array(unique) == [1, 2, 3]
コメント