Core Data에 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"];

Predicate Format String Syntax를 확인할 수도 있습니다 .


@inorganik 여기 에서 비슷한 주장을 읽었습니다 . 나는 이것에 대한 이유가 무엇인지 모르지만 그것이 효과가 있어야 하고 나를 위해합니다.
albertamg

@inorganik 나는 또한 그것을 시도하고 작동했습니다 ( "나를 위해 해"). 당신이 무엇을 시도했는지 모르겠습니다. 궁금합니다. 원하는 경우 정확히 동일한 코드를 시도 할 수 있도록 테스트 케이스에 대한 링크를 공유하세요.
albertamg

다시 테스트했는데 효과가 있었어요 ... 그래서 제가 틀렸어요. 다른 일로 인해 제 사건이 실패했을 것입니다. 어느 쪽이든 귀하의 답변에 +1
inorganik

@inorganik 아 알겠습니다. 귀하의 사건이 실패한 원인을 찾으면 알고 싶습니다. +1 주셔서 감사합니다! :)
albertamg

93

스위프트 4.0

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

bool이 nil과 같을 때 모든 객체를 가져 오는 방법이 있습니까? 아니면 항상 참 또는 거짓이어야합니까?
Apoorv Mote

@ApoorvMote, Xcode 9.4, Swift 4부터 예 : 조건 자에 일반 Bool 값을 사용하면 nil속성 값이있는 항목 이 검색됩니다. 예를 들어 속성의 값을로 설정합니다 nil( boolAttribute이 답변에 표시된대로 호출했다고 가정하겠습니다 ). 그런 다음 술어를 작성하십시오 let predicate = NSPredicate(format: "boolAttribute == %@", boolValue).. 참고 : boolValuetrue거나 false, NOT 이어야합니다 NSNumber(value: boolValue). 결과 술어는 다음과 같습니다 boolAttribute == nil.. 그 술어는 것이다 물체 반환 boolAttribute입니다 nil. ... 영원히 작동하지 않을 수 있습니다
리앤

이것은 작동합니다. "boolAttribute == 1"형식도 사용할 수 있습니다.
Zoltan Vinkler 2018

35

NSNumber로 변환하거나 이중 "=="를 사용하지 마십시오.

Swift> = 4에 더 적합합니다.

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

참고 :이 예에서 "true"는 Bool (Struct)입니다.


2
새로운 대답이어야합니다. 피트를 위해 2020 년
RyanM

16

스위프트 3

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

Swift 3에서는 다음을 사용해야합니다. NSNumber(value: true) .

사용 NSNumber(booleanLiteral: true)하고 일반적으로 어떤 문자 initialiser 직접 낙담하고 예를 들어 SwiftLint는 (V 0.16.1.) 사용에 대한 경고를 생성합니다 ExpressibleBy...Literal직접 initialiser :

컴파일러 프로토콜 초기화 위반 : 컴파일러 프로토콜에 선언 된 이니셜 라이저는 ExpressibleByArrayLiteral직접 호출해서는 안됩니다. (컴파일러 _ 프로토콜 _init)


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

3

스위프트 4

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

스위프트 3

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

2
이로 인해 Xcode 9.3 및 Swift 4.1에서 충돌이 발생합니다. 대신 이 방법을 사용하십시오 .
Tamás Sengel 2018

2

Swift 3.0 은 다음과 같이 약간 변경되었습니다.

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.