iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

Swift の Collection Type Set について知ろう

Set とは?

Swift の Collection Type の一つで、配列の順序が重要ではなく重複する値が無いような配列を作成したい場合に Array よりも便利に使用することができます。 また、格納する値は Hashable に準拠する必要があり、これにより様々な便利メソッドが使用できるようになります(後述します)。

余談ですが、これらのクラスは Objective-C では、NSSet という名前で使用されます。ですので、CoreData のモデルのプロパティとして追加する時なんかは NSSet を使用する必要があります。SetNSSet のブリッジングの詳細については下記を参照してください。

developer.apple.com

使い勝手

初期化

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 クラス同士は、論理演算で特定の値を取得するためのメソッドがそれぞれ用意されています(便利!)👷‍♀️

f:id:yum_fishing:20201122181753p:plain

下記が公式 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 の要素、他のセットの要素に内包されているかどうかを調べるためのメソッドも用意されています。

f:id:yum_fishing:20201122182046p:plain

下記がサンプルになります。

let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]

houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true

docs.swift.org

以上が Swift の Set 紹介でした!では、また明日🧑‍🔧

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com