我必须对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函数来大写我的数组中的字符串,但我想知道为什么这不起作用。
答案 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{}
但我不知道为什么前者导致循环中断。即使我从内循环中删除了所有内容,它仍然存在同样的问题。如果有人知道为什么会这样,请告诉我。