と の2 つのモデル化されたプロパティを持つサブクラスNSManagedObject
があります。Foo
a
b
a
とb
は ですがNSString
、インスタンス化される保証はありません。インスタンス化される可能性もあります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
である場合、問題なく動作するようです。
ここで何が欠けていますか?==
一方または両方が である 2 つのキーを比較すると、演算子が失敗するのはなぜnil
ですか?