iOS 11 NSPredicate搜索Swift阵列崩溃 - NSUnknownKeyException

时间:2017-09-22 18:32:27

标签: ios swift nspredicate ios11 xcode9

我正在使用NSPredicate来过滤Swift中的数组。问题是在更新到iOS 11(Xcode 9 / w Swift 4)之后,我一直在过滤器线上崩溃。这是崩溃日志:

  

由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:>'[valueForUndefinedKey:]:此类不是键>符号值与键名相符。'

以下是我有一个数组的类的示例:

final class Model: NSObject {
    let name: String
    init(name: String) {
        self.name = name
    }
}

以下是崩溃的代码:

let myArray = [Model(name: "Jason"), Model(name: "Brian")]
let predicate = NSPredicate(format: "name == 'Jason'")
let filteredArray = myArray.filter { predicate.evaluate(with: $0)}

问题是为什么现在我更新到iOS 11会崩溃?

1 个答案:

答案 0 :(得分:12)

经过一段时间的斗争,我终于找到了答案!

更新到Swift 4的一个微妙之处在于,作为NSObject的子类的类不再像之前那样隐式地暴露给objective-c。因此,您需要使用@objc显式注释类/函数。编译器会通知您需要注释的位置,但在这种情况下不会。

最终因此,键值查找不再隐含地暴露给objective-c,这需要使用NSPredicate进行过滤。下面的代码修复了崩溃!

解决方案1 ​​

extension Model {
    @objc override func value(forKey key: String) -> Any? {
        switch key {
        case "name":
            return name
        default:
            return nil
        }
    }
}

解决方案2

替代Uros19:您可以直接使用@objc(例如@objc let name: String)注释属性,而不是实现上述功能。关于为什么要用@objc注释属性,你会失去一点清晰度,但这只是一个小问题。

我希望这可以节省一些人的时间和挫折感。)