当我添加内部循环时,没有执行循环

时间:2016-04-01 16:19:13

标签: swift control-flow

我必须对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

当我删除内部for循环时,外部循环正常,但是当我添加内循环时,它永远不会超过外循环的第一次迭代。没有崩溃或任何事情 - 其他一切都只是恢复正常。

我不明白为什么会这样。我只是在密集而且缺少明显的东西吗?

或者,我可能只是编写一个map函数来大写我的数组中的字符串,但我想知道为什么这不起作用。

3 个答案:

答案 0 :(得分: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变体。< / p>

一个简单的例子:

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)

当然,首先你必须保留可变数组的概念。

答案 1 :(得分:0)

我之前没有使用swift,而是使用嵌套循环。在确定外部循环不会超过第一次迭代之前,你等了多长时间?

例如,如果您在嵌套循环中循环超过1000万种颜色,则需要一段时间。

或者,您是否需要在嵌套循环中递增迭代器并且它当前作为无限循环运行?

答案 2 :(得分:-1)

我通过改变内部for循环来修复它:

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

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

但我不知道为什么前者导致循环中断。即使我从内循环中删除了所有内容,它仍然存在同样的问题。如果有人知道为什么会这样,请告诉我。