53
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-02

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

参考文献

53
44
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?