2015-11-06 2 views
1

Теперь я используюКак использовать filterArrayUsingPredicate с NSDictionary?

let array = (displayNames as NSArray).filteredArrayUsingPredicate(searchPredicate) 

где displayNames является

var displayNames[String]() 

Но я хочу, чтобы использовать его с:

var displayNames[String: UIImage]() 

Как я могу использовать .filteredArrayUsingPredicate с displayNames части строки в NSDictionary ?

+0

Что вы хотите фильтровать? Уберите свою задачу. – katleta3000

+1

Он/она хочет отфильтровать ключи словаря, которые являются строками. –

+0

@StephenPaul точно! –

ответ

0

Получить ключи из словаря, используя свойство allKeys, и выполнить на нем фильтр. Попробуй это.

RE-EDIT: Попробуйте что-то вроде этого let theOriginalDictionary = [String : UIImage]() let searchPredicate = NSPredicate(format: "", argumentArray: nil) let otherDictionary = NSDictionary(dictionary: theOriginalDictionary) let arrayOfKeys = NSArray(array: otherDictionary.allKeys) let filteredArray = arrayOfKeys.filteredArrayUsingPredicate(searchPredicate)

+0

У меня есть ошибка: 'Значение типа '[String: UIImage]' не имеет участника 'allKeys'' –

+0

Ах, конечно. Это потому, что свойство 'allKeys' является только частью класса NSDictionary. Возможно, вы можете создать NSDictionary с помощью словаря [String: UIImage] и посмотреть, работает ли он. –

0

Если вы используете Swift, почему бы вам не использовать встроенные функции, как filter?

var displayNames = [String: UIImage]() 
let result = displayNames.filter {key,image in 
    return true // here add your predicate to filter, true means returning all 
} 
+0

OP, пожалуйста, попробуйте это решение. Выглядит солидно и менее многословно. –

+0

@OrkhanAlizade ты пробовал? Это уместно для вашей задачи? – katleta3000

0

Это звучит, как вы пытаетесь фильтровать словарь, в то время как сохраняя тип словаря после фильтра. Там несколько способов, чтобы сделать это, но, возможно, проще всего расширить словарь:

extension Dictionary { 
    func filter(@noescape includeElement: (Key, Value) throws -> Bool) rethrows -> [Key:Value] { 
    var result: [Key:Value] = [:] 
    for (k,v) in self where try includeElement(k,v) { 
     result[k] = v 
    } 
    return result 
    } 
} 

Затем, если вы хотите, чтобы фильтровать словарь, основанный на клавишах, вы можете сделать что-то вроде этого:

let dict = ["a": 1, "b": 2, "c": 3] 

let filtered = dict.filter { (k,_) in k != "a" } 

// ["b": 2, "c": 3] 
+0

Использование 'let filter = rosters.filter {(k, _) в k ==" \ (searchController.searchBar.text) "} print (filter)' ничего не дает –

+0

Есть ли проблема с условием фильтрации? Что означает '' \ (searchController.searchBar.text) "', например? Действительно ли этот ключ в словаре? – oisdk

+0

Кроме того, что вы фильтруете путем равенства в словаре? Характер словаря означает, что на ключ может быть только одно значение. Разумеется, 'rosters [" \ (searchController.searchBar.text) "]' будет делать то, что вы хотели? – oisdk

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