2016-04-01 10 views
0

を追加するときに、これは私にはどんな意味がないので、私は、スウィフトでどのようにフロー制御の作品の根本的な誤解を持っている必要があります実行されていません。は、私は内側のループ

//objects is of type [AnyObject]? 
for obj in objects!{ 
    let colors = obj.valueForKey("colors") as? NSMutableArray 
    if colors != nil{ 
     for i in 0...colors!.count{ 
      if colors![i] as? String != nil{ 
       colors![i] = (colors![i] as! String).capitalizedString 
      } 
     } 
     obj.setValue(colors, forKey: "colors") 
    } 
    obj.save() 
}//end for 

私はforループの内側を削除すると、外側の1が正常に動作しますが、私は内側のループを追加するとき、それは外側のループの最初の反復を超えて取得することはありません。クラッシュや何もありません。他のすべては正常に再開します。

なぜこれが起こっている私は理解していませんよ。私はちょうど高密度で何かが明白でないのですか?

代わりに、私はおそらくちょうど私の配列内の文字列を大文字にマップ機能を書くことができますが、私はこれが動作しない理由を理解したいです。

+2

予期しない動作の例を入力できますか? – Eiko

+0

クラッシュはありませんが、クラッシュで終了しなければならない '0 ... colors!.count'には明らかなエラーがあります。あなたの答えはその問題を解決することを示唆しているので、私はそこにクラッシュがあると確信しています。 – Sulthan

+0

@ Suulthan私もそう思っていましたが、それは遊び場で働いていたようです - NSMutableArrayではなくSwift Arraysを使用していたので、ループは決して実行されませんでした(colors = nil)。はい、明らかに間違っています。 :) – Eiko

答えて

-1
私は前が、ネストされたループの面で迅速に使用していない

は...どのくらいあなたは外側のループは最初の反復を過ぎてそれをすることはありませんことを決定する前に待っていましたか?例えば

、あなたはしばらく時間がかかるだろう、ネストされたループで1000万人以上の色を、ループしている場合。

また、ネストされたループ内でイテレータをインクリメントする必要がありますし、それが現在は無限ループとして実行されていますか?

-1

私はからforループの内側を変更することにより、それを修正:

for i in 0...colors!.count - 1{} 

for i in 0...colors!.count{} 

しかし、私は前者はループが破損する原因となった理由はわかりません。私が内側のループからすべてを削除したとしても、それはまだ同じ問題を抱えていました。なぜこれが起こったのか分かっている人は、私に知らせてください。

+0

よりよい修正は 'for i in 0 .. Sulthan

1

問題を実証する簡単な例:

let array: NSMutableArray = ["a", "b", "c"] 

for i in 0...array.count { 
    print("Index: \(i)") 
    print("Item: \(array[i])") 
} 

プリント:

Index: 0 
Item: a 
Index: 1 
Item: b 
Index: 2 
Item: c 
Index: 3 
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]' 

代わりの0...array.countあなたがより良い代替手段として、0..<array.countを使用しなければならない、あなたはスウィフトに配列をキャストする必要があります最初に配列を作成し、次により強力なfor-inバリアントを使用します。

簡単な例:もちろん

let array: NSMutableArray = ["a", "b", "c", 10, 20] 

let colors = array as [AnyObject] 
let newColors = colors.filter { $0 is String } 
         .map { ($0 as! String).capitalizedString } 

print(newColors) 

は、まずあなたが変更可能な配列の概念を残しています。

関連する問題