Swift の Set(セット)- ループ・map・filter
ここでは Swift の Set(セット)のループ方法と、filter・map メソッドの使い方についてご説明します。
Swift の Set(セット)をループする
Swift の Set(セット)をループするには、何通りか方法があります。
一番ベーシックな方法は for-in ループを使う方法です。
let numbers: Set = [1, 2, 3, 4, 5]
for number in numbers {
print(number)
}
実行結果は次のようになり、要素が全て print されています。Set は順序を保たない値の集合なので、順番は Insert に指定した順番とは違っています。
2
4
5
3
1
Array と同様に forEach() メソッドを使っても同じように、Set の要素を print することができます。
let numbers: Set = [1, 2, 3, 4, 5]
numbers.forEach { number in
print(number)
}
実行結果は次のようになり、要素が全て print されています。
2
5
4
1
3
for-in ループとの違いは forEach() では break や continue が使えないことなどがあげられます。
ループ処理の途中で何かの条件で break、continue、return したいような時は for-in ループを使ってください。
Set は要素の順番を意識しないユニークな値の集合ですが、Insert された時に値が格納される順番が決まって、その場所は固定されています。
同じコードを実行しても、実行する度にその順番は変わることが多いです。
enumerated() を使ってループすると、一応インデックスも取得できます。
let numbers: Set = [1, 2, 3, 4, 5]
for (index, number) in numbers.enumerated() {
print("\(index): \(number)")
}
実行結果は次のようになります。 配列のようにインデックスではアクセスできませんが、Set の要素のインデックスも取得できます。
0: 3
1: 1
2: 5
3: 2
4: 4
map() で Set(セット)から要素を変換した Array を生成する
Swift の Set(セット)の map() メソッドを使って、要素を変換した Array(配列)を生成することができます。
例えば、全ての要素を 10 倍した要素を持つ Array を生成したい時は次のようにできます。
let numbers: Set = [1, 2, 3, 4, 5]
let numbers10 = numbers.map { $0 * 10 }
print(numbers)
print(numbers10)
print(type(of: numbers10))
実行結果は次のようになり、numbers10 の要素は全て 10 倍になっていて、データ型が Array になっていますね。
[1, 2, 4, 5, 3]
[10, 20, 40, 50, 30]
Array<Int>
Set 型で取得したい時は、Set(numbers.map { $0 * 10 }) のようにすると、Set 型にできます。
filter() で要素をフィルターした Set を生成する
Swift の filter() メソッドを使って、Set(セット)から指定した条件を満たす要素だけを含んだ Set を生成することができます。
例えば、次のような numbers セットの中で、2 で割り切れるものだけを要素とした Set を生成するには次のようにできます。
let numbers: Set = [1, 2, 3, 4, 5, 6, 7, 8]
let numbers2 = numbers.filter { (number) in
return number % 2 == 0
}
print(numbers)
print(numbers2)
print(type(of: numbers2))
実行結果は次のようになり、numbers2 には 2 で割り切れる要素だけが含まれ、型は map() と違って Set になっていますね。
[3, 8, 5, 7, 6, 4, 2, 1]
[2, 4, 8, 6]
Set<Int>
以上、Swift の Set(セット)のループ方法と、filter・map メソッドの使い方についてご説明しました。