Posted at

Swift2.2でforループの挙動が違う

More than 3 years have passed since last update.

Swift2.2で、自動でdeprecatedのコードを変更した時、挙動が違います。

var array = [1,2,3,4,5,6,7,8,9,10]

for var i=0;i<array.count;i++ {
print(array[i])

if(i==5){
array.removeAtIndex(5)
}
}

このコードはdeprecatedと出ます。

なので、クリックして、リターンを押して自動で以下のように変更しました。

var array = [1,2,3,4,5,6,7,8,9,10]

for i in 0 ..< array.count {
print(array[i])

if(i==5){
array.removeAtIndex(5)
}
}

すると、例外が発生します。

なぜなら、前者のコードでは、array.removeAtIndex(5)によって、arrayの数が減っているので、forの行にあるarray.countの数が減ります。

しかし、後者のコードでは、forの行にあるarray.countの数が減りません。

なので、存在しないindexの配列の要素にアクセスしてしまいます。

なので、注意が必要です。バグの発生源になるので注意しましょう。