datatype
Swift
set

SwiftのSetとは?(Collection Typeを知る)

Collection TypeとしてのSet

*注意:コードも内容も大部分公式サイトからの翻訳です。自分用まとめとして残しました。

Collection Typeが値を保存するためのデータブロックで、あらかじめプログラム(この場合swift)で用意されたデータタイプです。
Array, set, dictionaryの3つがswfitにおけるCollectionTypeです。

CollectionTypes_intro_2x.png
*公式サイトの図

Setの特徴

  • ユニークなデータを保持する。
  • 単一なデータタイプが好ましい
  • 順番は関係なし

ユニークなデータしか保存されないので、同じデータを追加してしまった場合は無視されます。順番は関係ないので、保存した順も、昇降順関係なく、プリントされます。

set.swift
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等

non-hashable.swift
class MyClass{ var num:Int = 0 }
var myClass1 = MyClass()
var myClass2 = MyClass()
var mySet2:Set = [myClass1, myClass2] //エラー!!

*non-hashableクラスを保存しようとしたのでエラーが出ます。

Setに複数のデータタイプは保存できるの?

できないこともないですが、面倒なので素直にArrayを使いましょう。

AnyType.swift
//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のメソッドと同じ部分も多いです。

setFunctions.swift
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がセットだとして、以下のように合わせることができます。

set2.png

*公式サイトより

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

参考文献