iOS 11 NSPredicate 搜索 Swift 数组崩溃 - NSUnknownKeyException

iOS 11 NSPredicate search on Swift array crashing - NSUnknownKeyException

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

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: >'[ valueForUndefinedKey:]: this class is not key >value coding-compliant for the key name.'

这是我有一个数组的 class 的示例:

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: [=13=])}

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

折腾了半天,终于找到答案了!

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

最终,因此,键值查找不再隐式公开给 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 注释 属性,但这只是一个小考虑。

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