我一定对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函数来将数组中的字符串大写,但我想了解为什么这不起作用。
演示问题的一个简单示例:
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)
当然,首先必须放弃可变数组的概念。
我以前没有使用过swift,但在嵌套循环方面。。你等了多久才确定外循环不会通过第一次迭代?
例如,如果在嵌套循环中循环超过1000万种颜色,则需要一段时间。
或者,是否需要增加嵌套循环中的迭代器,而它当前正作为无限循环运行?
我通过将内部for循环从更改来修复它
for i in 0...colors!.count{}
至
for i in 0...colors!.count - 1{}
但我不知道为什么前者会导致循环中断。即使我从内部循环中删除了所有内容,它仍然存在相同的问题。如果有人知道为什么会发生这种事,请告诉我。