CoreDataでBOOL述語を書く方法は?


89

タイプのBOOL属性があり、この属性がであるすべての管理対象オブジェクトを検索したいと思いますYES

文字列属性の場合、それは簡単です。私は次のような述語を作成します:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];

しかし、selectedというbool属性があり、これの述語を作成したい場合、これを行うにはどうすればよいですか?私はこのようなことをすることができますか?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];

または、他の形式指定子が必要で、渡すだけYESですか?

回答:


101

述語プログラミングガイドから:

次の例に示すように、ブール値が等しいかどうかを指定してテストします。

NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

述語フォーマット文字列構文を確認することもできます。


@inorganik私はここで同様の主張を読みまし。私はこれの理由が何であるかわかりませんが、それがうまくいくはずであり、それは私のために働きます。
albertamg 2015

@inorganik私もそれを試しましたが、うまくいきました(「それは私のためになります」)。何を試したのかわかりません。気になります。必要に応じて、テストケースへのリンクを共有して、まったく同じコードを試すことができます。
albertamg 2015

私は再テストしました、そしてそれは働きました...それで私は間違っていました。他の何かが私のケースを失敗させたに違いありません。あなたの答えのいずれかの方法1
inorganik

@inorganikああなるほど。あなたがあなたの事件が失敗した原因を見つけたら、私は知りたいです。+1をありがとう!:)
albertamg 2015

93

Swift 4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

boolがnilに等しいすべてのオブジェクトをフェッチする方法はありますか?それとも、常に真または偽のいずれかである必要がありますか?
Apoorv Mote 2016

@ ApoorvMote、Xcode 9.4、Swift 4以降、はい:述語で通常のブール値を使用すると、nil属性値を持つアイテムが見つかります。たとえば、属性の値をに設定しますnilboolAttributeこの回答に示されているように、属性を呼び出したと言います)。次に、述語を作成しますlet predicate = NSPredicate(format: "boolAttribute == %@", boolValue)注:boolValue等しいtruefalse、ではない必要がありNSNumber(value: boolValue)ます。結果の述語は次のようになりますboolAttribute == nil。その述語boolAttributeがであるすべてのオブジェクト返しますnil。...永遠に動作しない場合があります
リアン

これは作品です。「boolAttribute == 1」形式を使用することもできます。
Zoltan Vinkler 2018年

35

NSNumberに変換したり、double "=="を使用したりしないでください

Swift> = 4に適しています:

NSPredicate(format: "boolAttribute = %d", true)

注:この例の「true」はBool(構造体)です


2
新しく受け入れられた答えでなければなりません。ピートのために2020年です
RyanM

16

スウィフト3

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

Swift 3では、を使用する必要がありますNSNumber(value: true)

NSNumber(booleanLiteral: true)リテラルイニシャライザーを直接使用することはお勧めしません。たとえば、SwiftLintv。0.16.1)は、イニシャライザーの使用に関する警告をExpressibleBy...Literal直接生成します。

コンパイラプロトコルの初期化違反:などのコンパイラプロトコルで宣言されたイニシャライザをExpressibleByArrayLiteral直接呼び出すことはできません。(compiler_protocol_init)


3
または:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
マーティンR

3

スウィフト4

request.predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

スウィフト3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)

2
これにより、Xcode9.3およびSwift4.1でクラッシュが発生します。代わりにこの方法を使用してください。
タマスセンゲル2018

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.