2

と の2 つのモデル化されたプロパティを持つサブクラスNSManagedObjectがあります。Fooab

abは ですが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 bisに対して空の結果が返される理由がわかりませんnull。しかし、それを変更すると正常に動作しますa != nil(これはbとにかくハードコードされた値です!!)

==この問題を調査するためにさらにテスト コードを作成したところ、キーを比較するときに、プロパティの LHS または RHS が であるnil場合、結果の配列は空になるようです。

一方、LHS と RHS が両方とも非nilである場合、問題なく動作するようです。

ここで何が欠けていますか?==一方または両方が である 2 つのキーを比較すると、演算子が失敗するのはなぜnilですか?

4

1 に答える 1