Xcode 9.3 - сбой NSPredicate Bool

После обновления Xcode 9.3 я заметил, что если вы хотите иметь такой Predicate:

let predicate = NSPredicate(format: "preferred = %@", true as CVarArg)

У вас авария. Но в Xcode 9.2 это не было проблемой. Есть идеи?


person Alessandro Francucci    schedule 17.05.2018    source источник
comment
Кажется, дело не в Xcode, а в обновлении Swift (Xcode 9.3 включает Swift 4.1)   -  person Anton Belousov    schedule 17.05.2018


Ответы (3)


// Решение 3 [ Документация Apple ]

let predicate = NSPredicate(format: "preferred == TRUE")

Исключение возникает потому, что true не является объектом (%@). Вам нужен заполнитель %d

let predicate = NSPredicate(format: "preferred = %d", true)
person vadian    schedule 17.05.2018

Я думаю, вы также можете использовать это:

NSPredicate(format: "preferred = true")
person Community    schedule 17.05.2018
comment
Да, это тоже решение! Я тоже это заметил. По сути, просто лучше избегать передачи быстрого логического значения в качестве CVarArg, как я делал сначала. Не могу точно понять, почему, но неважно. - person Alessandro Francucci; 17.05.2018

После небольшого расследования я обнаружил, как это исправить. Короче говоря:

// 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")

Как также объяснялось здесь, просто лучше иметь дело с типом Obj-C, а не со Swift. типа, когда нам приходится иметь дело с такого рода методами.

person Alessandro Francucci    schedule 17.05.2018
comment
NSPredicate(format: "preferred = %@", true as NSNumber) — еще один вариант. - person Martin R; 17.05.2018