2016-04-01 6 views
0

У меня должно быть фундаментальное непонимание того, как управление потоком работает в Swift, потому что для меня это не имеет никакого смысла.Цикл не выполняется, когда я добавляю внутренний цикл

//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 

Когда я удалить внутренний цикл, внешний один работает нормально, но когда я добавляю внутреннюю петлю, он никогда не получает мимо первой итерации внешнего цикла. Нет никаких аварий или чего-то еще - все остальное просто возобновляется нормально.

Я не понимаю, почему это происходит. Я просто плотный и пропуская что-то очевидное?

В качестве альтернативы, я мог бы просто написать функцию карты, чтобы использовать строки в массиве, но я хочу понять, почему это не работает.

+2

Можете ли вы привести пример ввода с неожиданным поведением? – Eiko

+0

Вы говорите, что нет сбоя, но есть очевидная ошибка в '0 ... цвета! .count', которая должна закончиться сбой. Ваш ответ предполагает, что исправление устраняет эту проблему, поэтому я уверен, что там был * сбой. – Sulthan

+0

@ Sulthan Я тоже так думал ... но, похоже, он работал на детской площадке - пока не заметил, что я использую Swift Arrays, а не NSMutableArray, поэтому цикл никогда не исполнялся (colors = nil). Так что да, это явно неправильно. :) – Eiko

ответ

-1

Я не использовал swift раньше, но с точки зрения вложенных циклов. Как долго вы ждали, прежде чем определять, что внешний цикл не пройдет мимо первой итерации?

Например, если вы зацикливаете более 10 миллионов цветов в вложенном цикле, это займет некоторое время.

В качестве альтернативы вам нужно увеличивать итератор во вложенном цикле и в настоящее время работает как бесконечный цикл?

-1

Я установил ее, изменив внутренний цикл из:

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

в

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

Но я понятия не имею, почему бывший приводившая петля ломаться. Даже когда я удалял все из внутреннего цикла, у него все еще была такая же проблема. Если кто-нибудь знает, почему это произошло, сообщите мне.

+0

Лучшим решением будет 'для i в 0 .. <цветах.count' или используя фактический массив Swift вместо 'NSMutableArray', который не должен использоваться вообще в Swift. – 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, в качестве еще лучшей альтернативы, вы должны привести массив к Swift сначала, а затем используйте более мощные варианты 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) 

Конечно, сначала вы должны оставить понятие изменяемых массивов.