WEBサイト制作・アプリ開発・システム開発・ブランディングデザイン制作に関するご相談はお気軽にご連絡ください。
構想段階からじっくりとヒアリングし、お客様の課題にあわせたアプローチ手法でお客様の“欲しかった”をカタチにしてご提案いたします。
Blog スタッフブログ
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()これでもっと簡単にコレクション操作ができることでしょう。良かったですね。