Blog スタッフブログ

Swift システム開発 ひとくちコードスニペット

[Swift]マイナーコレクション操作アレコレ

Swift

こんにちは、株式会社MIXシステム開発担当のBloomです。

今回はあまり使ったことがないけど便利なものや最近実装されたSequence、Collectionプロトコルにまつわる関数を紹介させていだきます。

count(where:)

条件に合致した要素数を返却します。Swift 6から利用できるようになりました。

let items = [1, 2, 3, 4, 5, 6]
let evenCount = items.count(where: { $0 % 2 == 0 })

difference(from:)

配列同士の差分を割り出すことができます。割り出した差分はapplying(_ difference:)によって適用し、配列をどちらかに合わせる操作も可能です。少しややこしいので気をつけて使いましょう。

let items1 = [1, 2, 3, 4, 5, 6]
let items2 = [1, 1, 2, 3, 5, 8]
let diffs = items1.difference(from: items2)
print(diffs)
        /* 出力結果
         CollectionDifference<Int>(
         insertions: [
            Swift.CollectionDifference<Swift.Int>.Change.insert(offset: 3, element: 4, associatedWith: nil),
            Swift.CollectionDifference<Swift.Int>.Change.insert(offset: 5, element: 6, associatedWith: nil)],
         removals: [
            Swift.CollectionDifference<Swift.Int>.Change.remove(offset: 1, element: 1, associatedWith: nil),
            Swift.CollectionDifference<Swift.Int>.Change.remove(offset: 5, element: 8, associatedWith: nil)])
         */

let applied = items2.applying(diffs)
print(applied)
        /* 出力結果
         Optional([1, 2, 3, 4, 5, 6])
         */

prefix(while:) / drop(while:)

先頭 / 末尾から条件に合致する要素までを抜き出す関数です。prefixは条件に合致しなくなった要素を含めませんが、dropは含めるので注意しましょう。

let items = [1, 2, 3, 4, 5, 6]
let prefixItems = items.prefix { $0 != 3 }
print(prefixItems) // [1, 2]
let dropItems = items.drop { $0 != 3 }
print(dropItems) // [3, 4, 5, 6]

merge(_ other: uniquingKeysWith:)

辞書同士をマージすることのできる関数です。uniquingKeysWithでキーが被った場合にどちらを優先するかを指定することができます。

var items = ["A":1, "B":2]
items.merge(["B":3,"C":4], uniquingKeysWith: max)
items.merge(["B":3,"C":4]) { $0 > $1 ? $0 : $1 } // この書き方でも同一
print(items) // ["B": 3, "C": 4, "A": 1]

randomElement()

配列からランダムな要素を返却します。空配列だとnilを返却する都合上optional型になります。乱数アルゴリズムは標準のRandomNumberGeneratorを利用しますが、randomElement(using:)を利用することで別の乱数アルゴリズムを指定できます。

let items = [1, 2, 3, 4, 5, 6]
let randomItem = items.randomElement()

shuffled()

シャッフルした配列を返却します。乱数の扱いはrandomElement()と同じで、shuffled(using:)も利用できます。

let items = [1, 2, 3, 4, 5, 6]
let shuffledItems = items.shuffled()

これでもっと簡単にコレクション操作ができることでしょう。良かったですね。