Set とは?
Swift の Collection Type の一つで、配列の順序が重要ではなく重複する値が無いような配列を作成したい場合に Array よりも便利に使用することができます。 また、格納する値は Hashable に準拠する必要があり、これにより様々な便利メソッドが使用できるようになります(後述します)。
余談ですが、これらのクラスは Objective-C では、NSSet
という名前で使用されます。ですので、CoreData のモデルのプロパティとして追加する時なんかは NSSet
を使用する必要があります。Set
と NSSet
のブリッジングの詳細については下記を参照してください。
使い勝手
初期化
var list1 = Set<String>() var list2: Set<String> = [] var list3: Set = ["hoge1", "hoge2", "hoge3"]
追加
append
ではなく、insert
を使用します。
var list: Set = ["hoge1", "hoge2", "hoge3"] list.insert("hoge4") print(list) // ["hoge1", "hoge3", "hoge2", "hoge4"]
ちなみに、配列の値はユニークになるので、同じ値を insert
しても追加されません。そして、順番もバラバラ。
var list: Set = ["hoge1", "hoge2", "hoge3"] list.insert("hoge3") print(list) // ["hoge2", "hoge1", "hoge3"]
削除
var list: Set = ["hoge1", "hoge2", "hoge3"] list.remove("hoge1") print(list) // ["hoge2", "hoge3"]
var list: Set = ["hoge1", "hoge2", "hoge3"] let index = list.firstIndex(of: "hoge1")! list.remove(at: index) print(list)
便利メソッド
Set クラス同士は、論理演算で特定の値を取得するためのメソッドがそれぞれ用意されています(便利!)👷♀️
下記が公式 Doc に載っていたサンプルコードになります。
let oddDigits: Set = [1, 3, 5, 7, 9] let evenDigits: Set = [0, 2, 4, 6, 8] let singleDigitPrimeNumbers: Set = [2, 3, 5, 7] oddDigits.union(evenDigits).sorted() // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] oddDigits.intersection(evenDigits).sorted() // [] oddDigits.subtracting(singleDigitPrimeNumbers).sorted() // [1, 9] oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted() // [1, 2, 9]
また、ある Set の要素、他のセットの要素に内包されているかどうかを調べるためのメソッドも用意されています。
下記がサンプルになります。
let houseAnimals: Set = ["🐶", "🐱"] let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"] let cityAnimals: Set = ["🐦", "🐭"] houseAnimals.isSubset(of: farmAnimals) // true farmAnimals.isSuperset(of: houseAnimals) // true farmAnimals.isDisjoint(with: cityAnimals) // true
以上が Swift の Set 紹介でした!では、また明日🧑🔧
参考
- https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html#ID484
- https://developer.apple.com/documentation/swift/set#2845530
- https://qiita.com/hmhmsh/items/3d2d8715a3b43e90af9b