2016-05-25 3 views
2

Я пытаюсь узнать чудесный мир NSPredicate, но я не могу практиковаться. Любые рекомендации приветствуются.NSPredicate для фильтрации массива словарей (Swift)

В частности, я хочу использовать NSPredicate для фильтрации массива словарей. Например, возьмите следующий массив и отфильтруйте его только до тех записей, где «species» == «dog».

var arrayofDictionary:[[String:String]] = [ 

     ["name": "Ben", "species": "human"], 
     ["name": "Harp", "species": "dog"], 
     ["name": "Guinness", "species": "dog"] 

] 

Теперь я знаю, как фильтровать следующий путь, но я понимаю, что это «ленивый» способ сделать это, и не будет работать так же быстро, делая большие вычисления:

let filteredArray = arrayofDictionary.filter { $0["species"] == "dog" }.flatMap { $0 } 

Так Я играю с NSPredicate и чувствую, что следующее может быть хорошим стартовым местом, но я не уверен, как его использовать. Кроме того, возможно, это работает только для массива, а не для словарей?

let speciesPredicate = NSPredicate(format: "species == %@", "dog") 

Благодарим за помощь!


я только смог найти рекомендации по этому вопросу в Objective-C here. К сожалению, я только начинаю поднимать Свифт.

Это было a good tutorial on NSPredicate, чтобы начать обнимать мою голову, но я не мог понять, как полностью реализовать для упомянутого выше случая.

+2

Где вы слышали, что с помощью быстрых затворов * "является„ленивый“способ сделать это, и не будет работать так быстро, когда делая большие вычисления "*? Я ВСЕГДА буду идти на закрытие, они типичны и не подвержены ошибкам рефакторинга. Но я думаю, что вы можете и должны отказаться от «flatMap». – luk2302

+0

Спасибо за отзыв! Что делает flatMap точно? Просто любопытно, почему вы рекомендуете его бросить. Ура! – Ben

ответ

1

Я согласен с комментарием @ luk2302 в том, что использование метода Swift Arrayfilter в целом лучше, чем фильтрация с помощью NSPredicate. Если вас беспокоит производительность в большом наборе данных, вы должны иметь свой контент в CoreData и использовать NSPredicate как часть NSFetchRequest с правильной настройкой индексации в вашей модели данных.

Сказав, что фильтрация NSPredicate не поддерживает явным образом тип Swift Array, поэтому вам нужно будет наложить на NSArray, чтобы использовать его. Это будет выглядеть примерно так:

let filteredArray = (arrayofDictionary as NSArray).filteredArrayUsingPredicate(speciesPredicate) 
+0

Спасибо за отзыв. Это подошло отлично. Основываясь на ваших отзывах и luk2302, я собираюсь пойти с фильтром закрытия. Если в какой-то момент я столкнулся с проблемами производительности, перейду к NSPredicate. – Ben

2

Пожалуйста, проверьте это

var customerNameDict = ["firstName":"karthi","LastName":"alagu","MiddleName":"prabhu"]; 
var clientNameDict = ["firstName":"Selva","LastName":"kumar","MiddleName":"m"]; 
var employeeNameDict = ["firstName":"karthi","LastName":"prabhu","MiddleName":"kp"]; 


var attributeValue = "karthi"; 
var arrNames:Array = [customerNameDict,clientNameDict,employeeNameDict]; 
var namePredicate =NSPredicate(format: "firstName like %@",attributeValue); 


let filteredArray = arrNames.filter { namePredicate.evaluateWithObject($0) }; 
println("names = ,\(filteredArray)"); 
Смежные вопросы