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



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

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注释属性的信息,您可能会变得有些不清楚,但这只是一个小问题。

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

10-08 07:46
查看更多