2016-01-12 6 views
2

У меня есть набор словарей, и я хочу отсортировать их по алфавиту с помощью клавиши «itemName» в каждом словаре. Как я могу сделать это в Swift?Сортировка массива словарей по значению ключа

Я хочу отсортировать элементыArray.

let array = PFUser.currentUser()?.objectForKey("Collections") as! [[String : AnyObject]] 
     let collectionsDictionary = array[0] 
     itemsArray = collectionsDictionary[self.title!] as! [[String : AnyObject]] 


     for dictionary in itemsArray { 
      itemNames.append(dictionary["itemName"] as! String) 
      itemUPC.append(dictionary["UPC"] as! String) 
      pricePaid.append(dictionary["pricePaid"] as! String) 
      currentPrice.append(dictionary["currentPrice"] as! String) 
      model.append(dictionary["model"] as! String) 
      if (dictionary["image"] != nil) { 
       imagesArray.append(dictionary["image"] as! PFFile) 
      } else { 
       imagesArray.append(nil) 
      } 
     } 

ответ

8

Вы можете прибегнуть к NSArray «ы sortUsingDescriptors функциональность:

let sortedArray = (itemsArray as NSArray).sortedArrayUsingDescriptors([NSSortDescriptor(key: "itemName", ascending: true)]) as [[String:AnyObject]] 

Swift> 3

let sortedArray = (itemsArray as NSArray).sortedArray(using: [NSSortDescriptor(key: "itemName", ascending: true)]) as! [[String:AnyObject]] 

Не очень Swift-ish, и вы теряете безопасность типа, но это делает работу.

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

+0

Спасибо! Он работает, хотя это не идеальное решение. – raginggoat

+0

Хорошая альтернатива, молодцы, +1! – Moritz

+0

Спасибо u .. очень хорошее решение. –

13

Вероятно, что-то вроде этого, используя sort:

let sortedArray = itemsArray.sort { $0["itemName"] < $1["itemName"] } 

где "$ 0" и "$ 1" представляют соответственно в массиве, каждый из словаря и его преемника.


Если компилятор жалуется на типы, потому что он не знает, что значение этого ключа является строка, вы можете бросить, как это (как сказал @Cristik в комментариях):

let sortedArray = itemsArray.sort { ($0["itemName"] as? String) < ($1["itemName"] as? String) } 
+0

Я получаю сообщение об ошибке «Ожидаемый тип». let sortedArray = itemsArray.sort {$ 0 ["itemName"] as String <$ 1 ["itemName"] as String} – raginggoat

+0

Размещение в скобках сделает компиляцию/работу кода: 'itemsArray.sort {($ 0 [" itemName "] as? String) <($ 1 [" itemName "] как? String)}' – Cristik

+0

@Cristik О, хорошо! Это то, что я искал раньше. Благодарю. :) – Moritz

0

У меня есть набор словарей, и я сортирую свой массив в алфавитном порядке с помощью «firstname» в каждом словаре. Вы также можете отсортировать массив, просто наложив свое имя массива в этом коде и ваш KEYNAME

/*

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "firstname", ascending: true, selector: #selector(NSString.caseInsensitiveCompare(_:))) 
let sortedResults: NSArray = yourArrayName.sortedArrayUsingDescriptors([descriptor]) 

    self.user_Array = NSMutableArray(array: sortedResults) 

*/

Надеюсь, это поможет вам.

+1

Это решение уже было задано здесь: http://stackoverflow.com/a/34747129/1974224? – Cristik

+0

При использовании значения селектора вы не являетесь. Так как же это? –

+0

Вы правы, я пропустил параметр селектора :) – Cristik

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