2016-01-21 2 views
11

У меня есть список объектов Realm (скажем, User), и я хочу получить все из них, кроме «John», «Marc», «Al 'Med» и т. Д.Как использовать NOT IN с Realm Swift

Я попытался следующие:

var namesStr = "" 
for user in unwantedUsers { 
    namesStr += "'" + user.name + "', " 
} 
namesStr = String(namesStr.characters.dropLast().dropLast()) 
let predicate = NSPredicate(format: "NOT name IN {%@}", namesStr) 
let remainingUsers = uiRealm.objects(User).filter(predicate) 

Я также попытался с NSPredicate(format: "name NOT IN {%@}", namesStr) но врезаться бы (поднял исключение).

И Вторая вещь, как я могу избежать названий в NSPredicate. Если одно из имен имеет символ ', это, вероятно, не сработает.


EDIT

Благодаря LE SANG, вот функциональный результат:

var userArr: [String] = [] 
for user in unwantedUser { 
    userArr.append(user.name) 
} 
let predicate = NSPredicate(format: "NOT name IN %@", userArr) 
let remainingUsers = uiRealm.objects(User).filter(predicate) 
+0

, что ' s [uiRealm. объекты (изображение)]? –

+0

@NguyenHoan Это опечатка, должна быть 'uiRealm.objects (Пользователь)' – Kalzem

+0

Возможный дубликат: «Как НЕ использовать Королевство в Swift»/jk –

ответ

20

Согласно Realm document, эти способы должны работать

let predicate = NSPredicate(format: "NOT (name IN %@)", namesStr) 
let predicate = NSPredicate(format: "!(name IN %@)", namesStr) 
let predicate = NSPredicate(format: "NOT name IN %@", namesStr) 
+0

Отлично! Я неправильно понял документ, когда он сказал «имя IN (« Лиза »,« Спайк »,« Хачи »). И мне даже не нужно конкатцировать массив в строку больше! – Kalzem

+0

Вы также можете использовать массив – onmyway133