作者:假如有梦想 | 来源:互联网 | 2023-01-17 10:50
我正在使用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> jason z..:
经过一段时间的战斗,我终于遇到了答案!
更新到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注释属性,你会失去一点清晰度,但这只是一个很小的考虑因素.
我希望这可以节省一些人的时间和挫折:)