Collection TypeとしてのSet
*注意:コードも内容も大部分公式サイトからの翻訳です。自分用まとめとして残しました。
Collection Typeが値を保存するためのデータブロックで、あらかじめプログラム(この場合swift)で用意されたデータタイプです。
Array, set, dictionaryの3つがswfitにおけるCollectionTypeです。
Setの特徴
- ユニークなデータを保持する。
- 単一なデータタイプが好ましい
- 順番は関係なし
ユニークなデータしか保存されないので、同じデータを追加してしまった場合は無視されます。順番は関係ないので、保存した順も、昇降順関係なく、プリントされます。
var myset:Set = ["Mike","Mike","Cathy","Malcom"]
print(myset) // ["Malcom", "Cathy", "Mike"] Mikeが一つない!
Setにデータを入れる場合、Data Typeはハッシュ化可能(Hashable)でなければいけない。
Hashableなデータタイプ = **比較可能(Equatable)**なデータタイプのことを言います。
Hashable data type例
String, Int, Bool, Double, Float, Character等
Hashableではないdata type例
Class, Dictionary, Set, Array等
class MyClass{ var num:Int = 0 }
var myClass1 = MyClass()
var myClass2 = MyClass()
var mySet2:Set = [myClass1, myClass2] //エラー!!
*non-hashableクラスを保存しようとしたのでエラーが出ます。
Setに複数のデータタイプは保存できるの?
できないこともないですが、面倒なので素直にArrayを使いましょう。
//Setの場合
var mySet2:Set<AnyHashable> = ["Mike",5,"Cathy","Malcom", 7]
print(mySet2)//[AnyHashable(5), AnyHashable("Malcom"), AnyHashable(7), AnyHashable("Cathy"), AnyHashable("Mike")]
//Arrayとの比較
var myArray:[Any] = ["my","mum", 1, 5]
print(myArray) //["my", "mum", 1, 5]
AnyHashableにキャストして見ましたが、やっぱり面倒。
Setへの保存+取得&基本的なメソッド
Arrayのメソッドと同じ部分も多いです。
var mySet:Set = [3,5,7,8,9,19]
print(mySet.count) //6
print(mySet.isEmpty) //false
mySet.insert(20)
print(mySet) //[19, 20, 9, 5, 7, 3, 8]
mySet.remove(5)
print(mySet) //[19, 20, 9, 7, 3, 8]
print(mySet.contains(100)) //false
var sortedSet = mySet.sorted()
print(sortedSet)//[3, 7, 8, 9, 19, 20]
最後のメソッドを載せたように、変数を作ればソートもできます。
Set Operations
Setではセット同士を比較して、データを抜く取得などできる便利メソッドがあるのです!aとbがセットだとして、以下のように合わせることができます。
*公式サイトより
let oddDigits: Set = [1, 2, 5, 6, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
print(oddDigits.union(evenDigits).sorted())
//[0, 1, 2, 4, 5, 6, 8, 9]
print(oddDigits.intersection(evenDigits).sorted())
// [2, 6]
print(oddDigits.subtracting(singleDigitPrimeNumbers).sorted())
// [1, 6, 9]
print(oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted())
// [1, 3, 6, 7, 9]
データがユニークだった場合これ使えるので最高ですね。
Set Membership & Equality
簡単に言ってしまえば、Set同士の中身を比較してBoolを返すメソッドです。
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
print(houseAnimals.isSubset(of: farmAnimals))
// true
print(farmAnimals.isSuperset(of: houseAnimals))
// true
print(farmAnimals.isDisjoint(with: cityAnimals))
// true