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)")
}