2016-03-27 1 views
5

次のSwift for-inループが配列内の要素よりも多くの要素を通過しようとしているようです。例えばFor-inループがone-far-farになり、アンラッピング中に 'nil'が見つからない

、このコード:

C-Style for loop 
1 
2 
3 
4 
5 
6 
7 

For each loop 
1 
2 
3 
4 
5 
6 
7 
fatal error: unexpectedly found nil while unwrapping an Optional value 
... 
Illegal instruction: 4 

私はここで何かが欠けている必要があります。

var list:[Int?] = [1,2,3,4,5,6,7] 

print("C-Style for loop") 
for var i=0; i<list.count; i++ 
{ 
    var x:Int = list[i]! 
    print(x) 
} 

print("\nFor-in loop") 
for var x:Int! in list 
{ 
    print(x) 
} 

は、この出力を取得します。 list.countは、for-inループがアンラップしようとする要素の数であるべきではありませんか?

上記の図ではありませんが、[Int?]の代わりに[Int]リストを使用すると、for-inループが正常に機能します。

私はSwiftバージョン2.1.1を使用しています。

+0

ここではいくつかの奇妙な行動を安全のラップを解除するには、for case構文を使用します。 'list'を' [Int] 'とし、' x'を 'Int'とすると' for-in'ループは 'nil'を永遠に表示します。 – BallpointBen

+0

@Robertそれはどのように動作するかを理解すれば、その動作は特に奇妙なものではありませんが、Swiftはおそらく単純にそのようなオプションである 'x'を(おそらく無限ループになる可能性があるため) – nhgrif

+0

何が起こっているのか簡単に説明できますか?なぜこれが無限ループになるのですか? – BallpointBen

答えて

4

基本的にはあなたがやらなければならないことをしているので、おそらくコンパイラのバグ(コンパイラがあなたを止めさせなかったからです)に遭遇しました。非常に素晴らしい!

今すぐ解決してください。あなたは明らかにあなたのInt!でアンラップしようとしています。

let list:[Int?] = [1,2,3,4,5,6,7] 
for case let x? in list 
{ 
    print(x) // 1, 2, 3, 4, 5, 6, 7 
} 

別の方法(同じ結果):

let list:[Int?] = [1,2,3,4,5,6,7] 
list.flatMap{$0}.forEach{print($0)} // 1, 2, 3, 4, 5, 6, 7 
+0

それで、それぞれの人は同じ問題を抱えています...恐ろしいです。 – Darko

+0

@Darkoいいえ、実際はそうではありません。それは私に別の解決策を与えます - 単純な 'list.forEach {print($ 0!)} 'はうまく動作します(もちろん、他の理由で危険です) – matt

+0

はい、list.forEach {print($ 0)}もクラッシュします。ここのフラットマップの必要性は私には怖いです。 – Darko

2

x:Int!のような強制アンラッピングは、nilを除外できないときは危険なコーディングスタイルです。 var x:Int = list[i]!についても同様です。

これは動作します:

ここ
print("\nFor-in loop") 
for x in list { 
    print(x) 
} 

あなたは、xがゼロであることを許可し、安全に、後にはnilをチェックすることができます。

は今、質問、なぜあなたのコードの休憩に:内部

、SWIFTはのためのインforループlist.generate()を使用しています。ジェネレータは終了していないので、おそらくコードが壊れます。

+0

しかし、問題はOPが望んでいないオプション(1)、オプション(2)などを生成することです。 – matt

+0

あなたは正しいです。私は印刷物がデバッグのためだけであると疑い、OPは明らかにどのようにアンラップするかを知っています。もっと興味深いのはなぜそれが失敗するかということでした。 –

関連する問題