LoginSignup
29
28

More than 5 years have passed since last update.

SwiftのRangeは配列ではない

Posted at

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...101..<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)")
}
29
28
6

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
29
28