無限ループするパターン、Playgroundならではの問題かと思ったら普通に実行しても再現できますね

mono 
Swift・iOSコラム
2 min readJan 14, 2017

--

i: Int! がバグ誘発してる感じですかね🤔

【追記】

バグではなく、@es_kumagai さんのこちらのコメントが正しそうです。

元記事と主旨はズレますが、関連して実用コードを紹介します( ´・‿・`)

[Int?]を普通にforで回すと次のように6回評価されて、iはOptional<Int>型です。

let array: [Int?] = [1, 2, nil, 3, 4, 5]
for i in array {
print(i)
}
// Optional(1)
// Optional(2)
// nil
// Optional(3)
// Optional(4)
// Optional(5)

次のように for case let 構文を使うと、nil抜きで5回評価されて、iはInt型になります。

let array: [Int?] = [1, 2, nil, 3, 4, 5]
for case let i? in array {
print(i)
}
// 1
// 2
// 3
// 4
// 5

i? ではなく i にすると普通にforで回した時と同じになってしまいますので注意です。

let array: [Int?] = [1, 2, nil, 3, 4, 5]
for case let i in array {
print(i)
}
// Optional(1)
// Optional(2)
// nil
// Optional(3)
// Optional(4)
// Optional(5)

正直あまり直感的な構文に感じられず、次のように flatMap 使った方が可読性良いかもしれません🤔

let array: [Int?] = [1, 2, nil, 3, 4, 5]
for i in (array.flatMap { $0 }) {
print(i)
}
// 1
// 2
// 3
// 4
// 5

--

--