我需要把json服务器响应解析成swift对象。我使用以下代码:
我希望能让“守卫”语句尽可能简短。首先,我添加了
struct MyGPSCoords {
var latitude:Double
var longitude:Double
var accuracy:Int
var datetime:NSDate
init?(infobrutFromJson_:[String:String]?)
{
guard let infobrut = infobrutFromJson_ else {
// first time the user sign up to the app, php server returns "null" in Json
return nil
}
guard
let lat:Double = Double(infobrut["latitude"] ?? "nil"),
let lng = Double(infobrut["longitude"] ?? "nil"),
let acc = Int(infobrut["accuracy"] ?? "nil"),
let dtm = NSDate(timeIntervalSince1970: Double(infobrut["time"] ?? "nil"))
else {
print("warning : unable to parse data from server. Returning nil");
return nil ; // position not NIL but format not expected => = nil
}
self.latitude = lat
self.longitude = lng
self.accuracy = acc
self.datetime = dtm
}
}
我希望能让“守卫”语句尽可能简短。首先,我添加了
??“nil”
,所以如果其中一个键不存在,Double("nil")
会得到nil
,并且守卫语句可以处理。对于NSDate,我编写了一个扩展,使用方便的init?
返回nil
,如果其输入为nil
,那么我也可以采用同样的方法。
我的问题是,我是否可以通过在guard
语句中直接为self.latitude赋值来使其更短?我试过这样做:
guard self.latitude = Double(infobrut["latitude"] ?? "nil"), ...
它说无法将 Double?
转换为 Double
。有没有办法让这个保护更短,并避免我分配 lat、lng、acc 和 dtm 缓冲变量?
-->
// 1 Optional<Int>` - Jordanlet
,而不是var
。 - Paulw11Codable
吗? - Paulw11[String: String]
,那么可解码性将无济于事。实际的JSON长什么样子,它是如何转换为infobrutFromJson_
字典的? - Sven