我在for循环中使用方法:
func filter (array: NSArray) -> NSMutableArray {
var filteredArray: NSMutableArray = NSMutableArray()
for objects in array as [MyObject] { // this line crash only on release mode
// TODO
}
return filteredArray
}
当它处于调试模式时它工作正常,但是当我改为发布模式时它就崩溃了:
for objects in array as [MyObject]{
当我将方法更改为此方法(不在内部循环中)时,它也不会在发布模式下调试时崩溃:
func filter (array: [MyObject]) -> NSMutableArray {
var filteredArray: NSMutableArray = NSMutableArray()
for objects in array {
// TODO
}
return filteredArray
}
有人可以解释原因吗?
答案 0 :(得分:1)
很难说不知道NSArray
里面究竟是什么。我建议设置一个断点并检查array
变量的内容。
但是,原因是as
运算符无法执行强制转换,因为array
中的至少一个元素不是MyObject
的(子类)的实例。我会通过使用可选的强制转换来保护该代码,但如果强制转换失败则会跳过整个for
循环。
func filter (array: NSArray) -> NSMutableArray {
var filteredArray: NSMutableArray = NSMutableArray()
if let array = array as? [MyObject] {
for objects in array as [MyObject] { // this line crash only on release mode
// TODO
}
}
return filteredArray
}
如果您确定该数组包含MyObject
个实例,那么我将使用swift数组而不是NSArray
来解决调用此函数的代码中的问题,从而避免出现转换问题,但是当然这取决于你的实际代码 - 所以这不是一个可能适用于所有情况的解决方案。
更新此解决方案还可以更好地解决您的问题,如果您的阵列中包含混合类型的元素,但您只想处理MyObject
类型的数据:
func filter (array: NSArray) -> NSMutableArray {
var filteredArray: NSMutableArray = NSMutableArray()
for element in array {
if let element = element as? MyObject {
// TODO
}
}
return filteredArray
}
不同之处在于,不是试图强制转换整个数组,而是尝试对每个元素进行强制转换。