我在使用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 = object
或object != nil
因为编译器不接受它。
这是一个错误还是我读错了?
答案 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
})