Ordina matrice di dizionari per valore chiave

Ho una serie di dizionari e voglio ordinarli alfabeticamente con la chiave “itemName” in ciascun dizionario. Come posso farlo in Swift?

Voglio ordinare gli elementiArray.

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) } } 

È ansible ricorrere alla funzionalità 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]] 

Non molto Swift-ish, e si perde la sicurezza del tipo, ma fa il suo lavoro.

E a proposito, hai un sacco di cast forzati nel tuo codice, che hanno il potenziale di bloccare la tua app, dovresti prendere in considerazione il passaggio a quelli opzionali.

Probabilmente qualcosa del genere, usando sort :

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

dove "$ 0" e "$ 1" rappresentano rispettivamente, nell'array, ciascun dizionario e il suo successore.


Se il compilatore si lamenta dei tipi perché non sa che il valore di questa chiave è una stringa, puoi eseguire il cast in questo modo (come detto da @Cristik nei commenti):

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

Ho una serie di dizionari e sto ordinando il mio array alfabeticamente con la chiave “firstname” in ciascun dizionario. Puoi anche ordinare il tuo array semplicemente inserendo il nome dell’array in questo codice e nel tuo 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) 

* /

Spero che ti aiuti.

‘$’ /// items è una matrice di dizionario / *

 let items: [[String: Any]] = [ ["itemName":"ZZ_Item", "itemDescription":"Homer"], ["itemName":"AA_Item", "itemDescription":"Marge"], ["itemName":"VV_Item", "itemDescription":"Bart"], ["itemName":"BB_Item", "itemDescription":"Lisa"], ["itemName":"XY_Item", "itemDescription":"Maggie"], ["itemName":"CC_Item", "itemDescription":"Ned"] ] print(items) 

* / /// Array un_sorted di / / P

/// [[“itemName”: “ZZ_Item”, “itemDescription”: “Homer”], [“itemName”: “AA_Item”, “itemDescription”: “Marge”], [“itemName”: “VV_Item”, ” itemDescription “:” Bart “], [” itemName “:” BB_Item “,” itemDescription “:” Lisa “], [” itemName “:” XY_Item “,” itemDescription “:” Maggie “], [” itemName “:” CC_Item “,” itemDescription “:” Ned “]]

/// ordina la matrice per la chiave itemsName

 func itemsSort(p1:[String:Any], p2:[String:Any]) -> Bool { guard let s1 = p1["itemName"] as? String, let s2 = p2["itemName"] as? String else { return false } return s1 < s2 } let sortedItemsArray = items.sorted { itemsSort(p1:$0, p2:$1) } print(sortedItemsArray) 

//// array ordinato O / P

[["itemName": "AA_Item", "itemDescription": "Marge"], ["itemName": "BB_Item", "itemDescription": "Lisa"], ["itemName": "CC_Item", "itemDescription": "Ned"], ["itemName": "VV_Item", "itemDescription": "Bart"], ["itemName": "XY_Item", "itemDescription": "Maggie"], ["itemName": "ZZ_Item", "itemDescription": "Homer"]]