/ / tablica z obiektami json musi być posortowana - json, swift

tablica z obiektami json musi być posortowana - json, swift

Dane json są zwracane z połączenia sieciowego dataTask i przypisywane do tablicy tutaj:

   let json = try? JSONSerialization.jsonObject(with: data!, options: [])
if let jsonarray = json as? [Any] {
self.cardArray = jsonarray
}

json wygląda tak:

[
{
"deviceID":114,
"UserName":"freds@hotmail.com",
"Name":"under sink",
"UniqueId":"D0:B5:C2:F2:B8:88",
"RowCreatedDateTime":"2018-01-02T16:07:31.607"
}
]

jak mogę posortować (opuścić) tę tablicę w oparciu o właściwość json o nazwie RowCreatedDateTime?

Próbowałem tego, ale to nie działało:

cardArray.sort{
$0.RowCreatedDateTime < $1.RowCreatedDateTime
}

Odpowiedzi:

2 dla odpowiedzi № 1

Zakładając, że wszystkie słowniki zawierają klucz RowCreatedDateTime musisz uzyskać wartości kluczem. Nie można używać notacji kropek ze słownikiem.

cardArray.sort{
($0["RowCreatedDateTime"] as! String) < $1["RowCreatedDateTime"] as! String
}

A jeśli wiesz, że typ tablicy jest [[String:Any]] nigdy nie rzucaj go do bardziej nieokreślonego [Any].


Ogłosić cardArray jako zestaw słowników

var cardArray = [[String:Any]]()

i przeanalizuj JSON w ten sposób

do {
if let jsonArray = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]] {
self.cardArray = jsonArray
}
} catch { print(error) }

Zastanów się, czy użyć Codable w Swift 4, aby przeanalizować JSON w strukturach. To znacznie ułatwia.


0 dla odpowiedzi nr 2

Robić cardArray [[String:Any]] zamiast [Any].

var cardArray = [[String:Any]]()

Następnie

let json = try? JSONSerialization.jsonObject(with: data!, options: [])
if let jsonarray = json as? [[String:Any]] {
self.cardArray = jsonarray
} else {
self.cardArray = []
}

Wreszcie

self.cardArray.sort {
guard let left = $0["RowCreatedDateTime"] as? String else { return true }
guard let right = $1["RowCreatedDateTime"] as? String else { return false }

return left < right
}