Làm cách nào để viết một vị từ BOOL trong Core Data?


89

Tôi có một thuộc tính kiểu BOOLvà tôi muốn thực hiện tìm kiếm tất cả các đối tượng được quản lý có thuộc tính này YES.

Đối với các thuộc tính chuỗi nó rất đơn giản. Tôi tạo một vị từ như sau:

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

Nhưng làm cách nào để làm điều này, nếu tôi có một thuộc tính bool được gọi là đã chọn và tôi muốn tạo một vị từ cho điều này? Tôi có thể làm điều gì đó như thế này không?

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

Hay tôi cần các mã định dạng khác và chỉ cần vượt qua YES?

Câu trả lời:


101

Từ Hướng dẫn lập trình Predicate :

Bạn chỉ định và kiểm tra sự bằng nhau của các giá trị Boolean như được minh họa trong các ví dụ sau:

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

Bạn cũng có thể kiểm tra Cú pháp chuỗi định dạng vị ngữ .


@inorganik Tôi đã đọc một yêu cầu tương tự ở đây . Tôi không biết lý do cho điều này là gì nhưng afaik nó sẽ hoạt động và nó phù hợp với tôi.
albertamg

@inorganik Tôi cũng đã thử và nó hoạt động ("nó phù hợp với tôi"). Tôi không biết bạn đã thử những gì. Tôi tò mò về nó. Nếu bạn muốn, hãy chia sẻ liên kết đến một trường hợp thử nghiệm để tôi có thể thử cùng một mã.
albertamg

Tôi đã thử lại và nó hoạt động ... vì vậy tôi đã sai. Một cái gì đó khác hẳn đã khiến trường hợp của tôi thất bại. Dù bằng cách nào thì +1 cho câu trả lời của bạn
inorganik

@inorganik ồ tôi hiểu rồi. Nếu bạn tìm ra nguyên nhân khiến trường hợp của bạn không thành công, tôi rất muốn biết. Cảm ơn vì đã +1! :)
albertamg

93

Swift 4.0

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

Có cách nào để tìm nạp tất cả các đối tượng cho bool bằng nil không ?? Hay nó luôn phải đúng hoặc sai ??
Apoorv Mote

@ApoorvMote, kể từ Xcode 9.4, Swift 4, có: nếu bạn sử dụng giá trị Bool thông thường trong vị từ, các mục có nilgiá trị thuộc tính sẽ được tìm thấy. Ví dụ: đặt giá trị của thuộc tính thành nil(chúng tôi sẽ nói rằng bạn đã gọi nó boolAttributenhư thể hiện trong câu trả lời này). Sau đó, tạo vị ngữ của bạn: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Lưu ý: boolValuephải bằng truehoặc false, KHÔNG NSNumber(value: boolValue). Vị kết quả sẽ là: boolAttribute == nil. Vị rằng sẽ trả lại bất kỳ đối tượng mà boolAttributenil. Có thể không hoạt động mãi mãi ...
Lean

Đây là công việc. Bạn cũng có thể chỉ cần sử dụng định dạng "boolAttribute == 1".
Zoltan Vinkler

35

Không chuyển đổi thành NSNumber, cũng như không sử dụng double "=="

Thích hợp hơn cho Swift> = 4:

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

Lưu ý: "true" trong ví dụ này là Bool (một Struct)


2
nên câu trả lời mới được chấp nhận. đó là năm 2020 vì lợi ích của pete
RyanM

16

Swift 3

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

Trong Swift 3 bạn nên sử dụng NSNumber(value: true).

Sử dụng NSNumber(booleanLiteral: true)và nói chung bất kỳ initialiser đen trực tiếp không được khuyến khích và cho ví dụ SwiftLint (v 0.16.1.) Sẽ tạo ra cảnh báo đối với việc sử dụng ExpressibleBy...Literalinitialiser trực tiếp:

Vi phạm đơn vị giao thức trình biên dịch: Các trình khởi tạo được khai báo trong các giao thức trình biên dịch chẳng hạn như ExpressibleByArrayLiteralkhông nên được gọi trực tiếp. (compiler_protocol_init)


3
Ngoài ra:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R

3

Swift 4

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

Swift 3

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

2
Điều này gây ra sự cố với Xcode 9.3 và Swift 4.1. Sử dụng phương pháp này thay thế.
Tamás Sengel

2

Swift 3.0 đã thực hiện một thay đổi nhỏ đối với điều này:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.