追記:fuzzballさんより、問題のフォーマットなら、日付順がちょうど辞書順と同じなので、直接比較しても大丈夫です。教えてくれてありがとうございます!
swift
1var dictionary_box:[[String:String]] =
2[["name": "たろう", "money": "1000円", "birth_date": "2020年05月15日"],
3 ["name": "じろう", "money": "20000円", "birth_date": "2020年05月20日"],
4 ["name": "としろう", "money": "1001円", "birth_date": "2020年05月18日"]]
5
6let sorted = dictionary_box.sorted { $0["birth_date"]! > $1["birth_date"]! }
元の回答:
swift
1var dictionary_box: [[String : String]] =
2[["name": "たろう", "money": "1000円", "birth_date": "2020-05-15"],
3 ["name": "じろう", "money": "20000円", "birth_date": "2020-05-20"],
4 ["name": "としろう", "money": "1001円", "birth_date": "2020-05-18"]]
5
6dictionary_box.sort {
7 let d: [(Int, Int, Int)] = [$0["birth_date"]!, $1["birth_date"]!].map {
8 let yb = $0.startIndex // 年の頭
9 let ye = $0.index(yb, offsetBy: 3) // 年の尾
10 let mb = $0.index(ye, offsetBy: 2) // 月の頭
11 let me = $0.index(mb, offsetBy: 1) // 月の尾
12 let db = $0.index(me, offsetBy: 2) // 日の頭
13 let de = $0.index(db, offsetBy: 1) // 日の尾
14 let year = Int($0[yb...ye])!
15 let month = Int($0[mb...me])!
16 let day = Int($0[db...de])!
17 // print(year, month, day)
18 return (year, month, day)
19 }
20 return d[0].0 != d[1].0 ? d[0].0 > d[1].0
21 : d[0].1 != d[1].1 ? d[0].1 > d[1].1
22 : d[0].2 > d[1].2
23}
修正:ただ年月日の比較を||
(OR)で繋がったら、年か月か日か一つだけ大きいの方が前にしてしまいます。上記のようで、年が同じの場合だけ月を比較していいです。