After the Xcode 9.3 update, I\'ve noticed that if you want to have Predicate like this:
let predicate = NSPredicate(format: \"preferred = %@\", true as CVarArg)
// Solution 3 [ Apple Documentation ]
let predicate = NSPredicate(format: "preferred == TRUE")
The exception occurs because true
is not an object (%@
). You need the %d
placeholder
let predicate = NSPredicate(format: "preferred = %d", true)
I think you can also use this:
NSPredicate(format: "preferred = true")
After a bit of investigation, I've discovered how to fix this. In short:
// Solution 1 [ NSNumber ]
let bool = NSNumber(booleanLiteral: true)
let predicate = NSPredicate(format: "preferred = %@", bool as CVarArg)
// Solution 2 [ Bool ] (static example)
let predicate = NSPredicate(format: "preferred == YES")
As also explained here, it's simply better to deal with Obj-C type instead of Swift type when we have to deal with this kind of methods.