web-dev-qa-db-ja.com

Core DataでBOOL述語を書く方法は?

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

文字列属性については簡単です。次のような述語を作成します。

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

しかし、selectedというbool属性があり、これの述語を作成したい場合、どうすればよいですか?このようなことをしてもいいですか?

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

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

77
Proud Member

From Predicate Programming Guide

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

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

Predicate Format String Syntax も確認できます。

98
albertamg

Swift 4.

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

Swift 3

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

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

NSNumber(booleanLiteral: true)と一般的なリテラル初期化子を直接使用することは推奨されません。たとえば、 SwiftLint (v。0.16.1)は、使用法_ExpressibleBy...Literal_の初期化子を直接警告します。

コンパイラプロトコルの初期化違反:ExpressibleByArrayLiteralなどのコンパイラプロトコルで宣言された初期化子を直接呼び出さないでください。 (compiler_protocol_init)

16
Lukas Kukacka

NSNumberに変換せず、二重の "=="を使用しないでください

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

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

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

6
alegelos

Swift 4

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

Swift

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

Swift 3.はこれにわずかな変更を加えました:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
2
Mario Hendricks