Swift Algorithm を使おう #2

Swift

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]

コメント

タイトルとURLをコピーしました