在评估nil时,为什么NSPredicate with block会失败?

时间:2016-05-27 10:21:52

标签: ios swift

我在使用NSPredicate调试崩溃时发现了这一点。好像它没有正确检查零值。

let blockPredicate = NSPredicate(block: { (object, _) -> Bool in
    guard let object = object as? String else {
        return false
    }
    return true
})

blockPredicate.evaluateWithObject("Hello")  // true
blockPredicate.evaluateWithObject(nil)      // EXEC_BAD_ACCESS (code=1,address=0x0)

文档说明这应该有用。

public init(block: (AnyObject, [String : AnyObject]?) -> Bool)
public func evaluateWithObject(object: AnyObject?) -> Bool // evaluate a predicate against a single object

该块应该会收到正确的AnyObject,但会传入nil指针0x0。无法使用nil检查if let object = objectobject != nil因为编译器不接受它。

这是一个错误还是我读错了?

1 个答案:

答案 0 :(得分:1)

问题是块类型表明它应该是非可选的AnyObject。实际上它可以是nil,因此它应该是AnyObject?

解决方案是将其包裹在Optional中,然后再打开它。

let blockPredicate = NSPredicate(block: { (object, _) -> Bool in
    let optionalObject = Optional(object)
    guard let object = optionalObject as? String else {
        return false
    }
    return true
})