2014-09-01 7 views
3

Я пытаюсь динамически создавать предикаты и выполнять выборку.Swift - динамически генерировать NSPredicate?

Значения могут быть либо строки или Int, когда и INT значение посылается NSPredicate инициализатор он выходит из строя из-за ошибки:

- [__ NSCFNumber rangeOfString]: непризнанные селектор направлен например

Я знаю, что проблема в формате% @ для Int, но есть ли способ сделать эту динамику, чтобы мне не пришлось вручную проверять String и Int, а затем создавать предикат?

var keyValues: [String: AnyObject] 
var predicates: [NSPredicate]() 

for (key, value) in keyValues { 
    var predicate = NSPredicate(format: "%K = %@", key: [value]) 
    predicates.append(predicate) 
} 

var compundPredicate = NSCompoundPredicate.andPredicateWithSubpredicates(predicates) 

ответ

15

value as NSObject делает трюк:

var keyValues: [String: AnyObject] = ["name" : "John Doe", "age" : 39] 
var predicates = [NSPredicate]() 

for (key, value) in keyValues { 
    var predicate = NSPredicate(format: "%K = %@", key, value as NSObject) 
    predicates.append(predicate) 
} 

var compundPredicate = NSCompoundPredicate.andPredicateWithSubpredicates(predicates) 
println(compundPredicate) 

Выход:

 
name == "John Doe" AND age == 39 

Обновление для Swift 3/4:

let keyValues = ["name" : "John Doe" as NSObject, "age" : 39 as NSObject] 
var predicates = [NSPredicate]() 

for (key, value) in keyValues { 
    let predicate = NSPredicate(format: "%K = %@", key, value) 
    predicates.append(predicate) 
} 

let compundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates) 

Или короче:

let keyValues = ["name" : "John Doe" as NSObject, "age" : 39 as NSObject] 
let predicates = keyValues.map { NSPredicate(format: "%K = %@", $0.key, $0.value) } 
let compundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates) 
+2

Вы везде :) Спасибо за ответ, даст ему попробовать – aryaxt

+0

Просто обновить код. NSCompoundPredicate изменился в swift 2, теперь вы должны использовать инициализатор 'NSCompoundPredicate (andPredicateWithSubpredicates: predicates)' – FouZ

Смежные вопросы