無限ループするパターン、Playgroundならではの問題かと思ったら普通に実行しても再現できますね
Published in
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
ちなみに、こちらで上記のfor case let
構文含めて様々なパターンマッチ構文を紹介しています👀