Swiftで無限ループするパターンが見つかる

下のプログラムを実行すると無限ループします。試したのはPlayground。Xcode 8.2.1でSwiftのバージョンは3.0.2。

let array: [Int?] = [1, 2, 3, 4, 5]
for i: Int! in array {
i
}

試すなら脱出カウンター付きの下のほうがよいです。

let array: [Int?] = [1, 2, 3, 4, 5]
var counter = 0
for i: Int! in array {
i
counter += 1
if counter == 1000 {
break
}
}

で、5以降は何が i に入っているのか確認するためにこうしました。

let array: [Int?] = [1, 2, 3, 4, 5]
var counter = 0
for i: Int! in array {
if i == nil {
print("nil")
}
i
counter += 1
if counter == 1000 {
break
}
}

すると print("nil") のところが995回実行されました。

また、配列をオプショナルでないInt型で宣言しても同じようにループします。

let array: [Int] = [1, 2, 3, 4, 5]
var counter = 0
for i: Int! in array {
i
counter += 1
if counter == 1000 {
break
}
}

[Int]から取り出したものをInt!に入れているところで「それは無駄です」系のワーニングを出すような気がしますが、ないので何か処理が抜けている感じがあります。

これらは、すでに知られた挙動なんでしょうか?

まとめ?

for a in b {} 構文は b の中のものを順番に取り出して最後まで行ったら終了という単純な処理ではない様子。入れる変数 a の型によってループ終了の挙動が変わる。そんなところに型宣言を入れることはあまりないと思いますが。