map
少しおもしろい実験をしてみましょう。
以下のようなコードが動きます。
let range = (1...10).map { i in i * 2 }
for i in range {
println("i: \(i)")
}
以下のようなコードはコンパイルエラーとなります。
let range = (1...10).filter { i in i % 2 == 0 }
for i in range {
println("i: \(i)")
}
SwiftのRangeとは
こういう1...10
や1..<10
のことをRangeと呼びます。
...
はClosedInterval<T>
型に、..<
はHalfOpenInterval<T>
型になります。
for i in 1...10 {
println("i: \(i)")
}
ClosedInterval<T>
型も、..<
はHalfOpenInterval<T>
型も、map
メソッドを実装していますが、filter
メソッドは実装していません。
そのため、先ほどのコードはコンパイルエラーとなったのです。
Rangeに対してfilterしたいとき
map
メソッドを噛ますとArray
になるのでmapしてからfilterしてあげると動きます。
※もっと良い方法があれば教えてください :)
let range = (1...10).map { i in i }.filter { i in i % 2 == 0 }
for i in range {
println("i: \(i)")
}