iOS 11 NSPREDICATE搜索在Swift Array崩溃-NSunknowneKeyException中



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

终止应用程序由于未被发现的例外" nsunknownekeyexception",原因:>'[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?

,为什么崩溃了

与此战斗一段时间后,我终于遇到了答案!

更新到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注释属性的原因,您会失去一点清晰的信息,但这只是一个小的考虑。

我希望这能节省一些人的时间和沮丧:)

相关内容

  • 没有找到相关文章

最新更新