高小高
高小高

Reputation: 37

Swift Array sort with JSON

Data: tried get data from JSON

has code with Swift run on Playground

 var roadWayStatusArray = [AnyObject]()


let url = URL(string: "http://od.moi.gov.tw/data/api/pbs")
let data = try? Data(contentsOf: url!)
let json = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
if let results = json as? [String : AnyObject] {
    if let result = results["result"] as? [[String : AnyObject]] {
        for data in result {
            let happendate = data["happendate"] as? String
            roadWayStatusArray.append(data as AnyObject!)
        }
    }
}

I has tried using roadWayStatusArray.sort(by: >) but Xcode report me Ambiguous reference member '>'

How to create sort by hapendate or happentime

Upvotes: 0

Views: 443

Answers (1)

rob mayoff
rob mayoff

Reputation: 385600

Your roadWayStatusArray is an array of AnyObject. There is no > operator defined for AnyObject.

The objects in roadWayStatusArray are actually dictionaries that look like this:

{
    UID = "10602090007-0";
    areaNm = "\U4e2d\U5c71\U9ad8\U901f\U516c\U8def-\U570b\U9053\Uff11\U865f";
    comment = "\U5317\U4e0a.\U4e2d\U58e2\U670d\U52d9\U5340 \U51fa\U53e3\U531d\U9053\U4e2d \U53f3\U5074 \U5c0f\U5ba2\U8eca\U505c\U653e\Uff0c\U99d5\U99db\U7591\U4f3c\U7761\U8457\U4e86";
    direction = "\U5317\U4e0a";
    happendate = "2017-02-09";
    happentime = "01:08:00.0000000";
    modDttm = "2017-02-09 01:15:43.603";
    region = N;
    road = "";
    roadtype = "\U5176\U4ed6";
    srcdetail = "\U71b1\U5fc3\U807d\U773e";
    x1 = "121.73558";
    y1 = "25.12263";
}

You need to call sort(by:) with a closure that determines the sort order. For example, if you want to sort by happendate and then happentime:

roadWayStatusArray.sort(by: { (lhsAny, rhsAny) -> Bool in
    let lhs = lhsAny as? [String: AnyObject]
    let rhs = lhsAny as? [String: AnyObject]
    let lhsKey = (lhs?["happendate"] as? String ?? "", lhs?["happentime"] as? String ?? "")
    let rhsKey = (rhs?["happendate"] as? String ?? "", rhs?["happentime"] as? String ?? "")
    return lhsKey < rhsKey
})

Upvotes: 1

Related Questions