2

我在内部使用带有 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
}

有人可以解释为什么吗?

4

1 回答 1

1

很难说不知道里面到底是什么NSArray。我建议设置一个断点并检查array变量的内容。

但是,原因是as操作符进行强制转换失败,因为 in 中的至少一个元素array不是 (a subclass of) 的实例MyObjectfor我会通过使用可选强制转换来保护该代码,尽管如果强制转换失败会跳过整个循环。

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
}

不同之处在于,不是尝试强制转换整个数组,而是尝试对每个元素进行强制转换。

于 2014-11-04T09:43:57.033 回答