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

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

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

ループカウンタの i を Int! で宣言しているところがポイントです。

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

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 に入っているのか確認するために nil かどうかのチェックを入れました。

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回実行されました。nil が入っているようです。

また、配列をオプショナルでない 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 の型によってループ終了の挙動が変わる。そんなところに型宣言を入れることはあまりないと思いますが。

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.