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"
}
]
RowCreatedDateTimeというjsonプロパティに基づいてこの配列をソート(降順)するにはどうすればよいですか?
私はこれを試みたが、うまくいかなかった:
cardArray.sort{
$0.RowCreatedDateTime < $1.RowCreatedDateTime
}
回答:
回答№1は2すべての辞書にキーが含まれていると仮定します 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を解析して構造体に変換します。それは事をもっと簡単にします。
回答№2の場合は0
メイク 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
}