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 注释 属性,但这只是一个小考虑。
我希望这可以节省一些人的时间和挫败感:)
我正在使用 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 注释 属性,但这只是一个小考虑。
我希望这可以节省一些人的时间和挫败感:)