Çekirdek Verilere bir BOOL koşulu nasıl yazılır?


89

Bir tür özniteliğim var BOOLve bu özniteliğin olduğu tüm yönetilen nesneler için bir arama yapmak istiyorum YES.

Dize nitelikleri için basittir. Bunun gibi bir yüklem yaratıyorum:

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

Ama seçilmiş adında bir bool özniteliğim varsa ve bunun için bir dayanak oluşturmak istersem , bunu nasıl yaparım ? Böyle bir şey yapabilir miyim?

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

Yoksa başka biçim belirleyicilere ihtiyacım var ve sadece geçmeli YESmiyim?

Yanıtlar:


102

Gönderen Yüklem Programlama Kılavuzu :

Aşağıdaki örneklerde gösterildiği gibi Boole değerlerinin eşitliğini belirtir ve test edersiniz:

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

Predicate Format String Syntax'e de göz atabilirsiniz .


@inorganik Burada benzer bir iddia okudum . Bunun sebebi nedir biliyor ama afaik yok etmelidir çalışmak ve bu benim için yapar.
albertamg

@inorganik Ben de denedim ve işe yaradı ("benim için yapıyor"). Ne denedin bilmiyorum. Ben merak ediyorum. İsterseniz, aynı kodu deneyebilmem için bir test senaryosunun bağlantısını paylaşın.
albertamg

Tekrar test ettim ve işe yaradı ... bu yüzden yanılmışım. Davamın başarısız olmasına başka bir şey neden olmuş olmalı. Cevabınızda her iki durumda +1
inorganik

@inorganik oh anladım. Davanızın başarısız olmasına neyin sebep olduğunu bulursanız, bilmek isterim. +1 için teşekkürler! :)
albertamg

94

Swift 4.0

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

Bool eşittir nil için tüm nesneleri getirmenin bir yolu var mı? Yoksa her zaman doğru mu yanlış mı olmalı?
Apoorv Mote

@ApoorvMote, Xcode 9.4, Swift 4 itibariyle, evet: yüklemde normal bir Bool değeri kullanırsanız, nilöznitelik değerlerine sahip öğeler bulunacaktır. Örneğin, bir özniteliğin değerini olarak ayarlayın nil( boolAttributebu yanıtta gösterildiği gibi adlandırdığınızı söyleyeceğiz ). Ardından, yüklemi oluşturun: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Not: boolValueeşit olmalıdır trueveya falseDEĞİLDİR NSNumber(value: boolValue). Ortaya çıkan yüklem olacaktır: boolAttribute == nil. Yani yüklem edecek herhangi bir nesneyi döndürmek boolAttributeolduğunu nil. Sonsuza kadar çalışmayabilir ...
leanne

Bu çalışır. Ayrıca "boolAttribute == 1" biçimini de kullanabilirsiniz.
Zoltan Vinkler

39

NSNumber'a dönüştürme veya çift "==" kullanmayın

Swift> = 4 için daha uygun:

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

Not: Bu örnekte "true" bir Bool'dur (bir Struct)


4
yeni kabul edilen cevap olmalıdır. Pete aşkına 2020
RyanM

16

Hızlı 3

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

Swift 3'te kullanmalısınız NSNumber(value: true).

Kullanılması NSNumber(booleanLiteral: true)ve genel olarak herhangi bir hazırlayıcıyı doğrudan kullanmak tavsiye edilmez ve örneğin SwiftLint (v. 0.16.1) ExpressibleBy...Literaldoğrudan kullanım başlatıcı için uyarı oluşturacaktır :

Derleyici Protokolü Başlatma İhlali: Derleyici protokollerinde bildirilen başlatıcılar, ExpressibleByArrayLiteraldoğrudan çağrılmamalıdır. (compiler_protocol_init)


3
Alternatif olarak:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R

3

Swift 4

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

Hızlı 3

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

2
Bu, Xcode 9.3 ve Swift 4.1 ile bir çökmeye neden olur. Kullan bu yöntemi yerine.
Tamás Sengel

2

Swift 3.0 , bunda ufak bir değişiklik yaptı:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.