我有一个NSManagedObject
子类Foo
,它有两个建模属性:a
和b
.
a
和b
是NSString
s,但不能保证它们会被实例化——它们也可以是nil
。事实上,就像现在发生的那样,所有Foo
实例都b
等于nil
。
我想获取所有Foo
对象,例如a != b
:
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Foo"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"a != b"];
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
结果数组是空的,即使我知道我有 10 个a
绝对不是 nil
的对象。
事实上,我什至可以通过将谓词调整为:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"a != nil"];
效果很好,并返回给我 10 个对象。
NSPredicate
/的这种行为NSFetchRequest
很奇怪,我不明白为什么它会为原始a != b
谓词 where b
is返回一个空结果null
。但是当我将其更改为时工作正常a != nil
(这只是硬编码的值b
!!)
编写了更多测试代码来探索这个问题,似乎在比较键时,如果==
属性的 LHS 或 RHS 是nil
,则结果数组为空。
另一方面,如果 LHS 和 RHS 都不是nil
,那么它似乎工作正常。
我在这里想念什么?为什么==
操作员在比较两个键中的一个或两个时会失败nil
?