此处描述的两种解决方案都会自动丢弃price 不可用或不是有效Double 值的值。
解决方案 1:结构化方法
型号
struct Item: Comparable {
let id: Int
let name: String
let price: Double
init?(dict: [String:Any]) {
guard let
id = dict["id"] as? Int,
name = dict["name"] as? String,
priceString = dict["price"] as? String,
price = Double(priceString) else {
return nil
}
self.id = id
self.name = name
self.price = price
}
}
func <(left: Item, right: Item) -> Bool {
return left.price < right.price
}
func ==(left: Item, right: Item) -> Bool {
return left.price == right.price
}
数据
var data : [[String:Any]] = [
["id": 932, "name": "x product", "price": "84.00"],
["id": 173, "name": "z product", "price": "69.00"],
["id": 818, "name": "y product", "price": "155.00"]
]
排序
let sortedItems = data.flatMap { Item(dict: $0) }.sort()
解决方案 2:非结构化方法
let sortedData = data.flatMap { (dict:[String : Any]) -> (dict:[String : Any], price: Double)? in
guard let
priceString = dict["price"] as? String,
price = Double(priceString) else { return nil }
return (dict, price) }
.sort { $0.1 < $1.1 }
.map { $0.dict }