/ / масив з об'єктами json потрібно сортувати - json, swift

масив з об'єктами json потрібно сортувати - json, swift

Дані json повертаються з мережевого виклику DataTask і призначаються для масиву тут:

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

json виглядає так:

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

як я можу сортувати (знижуючи) цей масив на основі властивості json з назвою RowCreatedDateTime?

Я спробував це, але це не спрацювало:

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

Відповіді:

2 для відповіді № 1

Припускаючи, що всі словники містять ключ RowCreatedDateTime ви повинні отримати значення за ключовим словом. Ви не можете використовувати точка-позначення зі словником.

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

І якщо ви знаєте, що тип масиву є [[String:Any]] Ніколи не кидайте його набагато більше невизначеною [Any].


Оголосити cardArray як масив словників

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

і розібрати JSON таким способом

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

Розглянемо можливість використовувати Codable в Swift 4 для аналізу JSON на структури. Це полегшує роботу.


0 для відповіді № 2

Зробити cardArray [[String:Any]] замість [Any].

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

Потім

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

Нарешті

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
}