对于示例A ,我在Swift中有struct
的以下代码:
struct Location {
let name: String
let tzs: String
let lat: String
let lon: String
init(jsonDict: [String: AnyObject]) {
guard let name = jsonDict["name"] as? String else {
self.name = "none"
return
}
guard let tzs = jsonDict["tzs"] as? String else {
self.tzs = "none"
return
}
guard let lat = jsonDict["lat"] as? String else {
self.lat = "none"
return
}
guard let lon = jsonDict["lon"] as? String else {
self.lon = "none"
return
}
self.name = name
self.tzs = tzs
self.lat = lat
self.lon = lon
}
}
从解析JSON数据获得的字典初始化属性。不幸的是,该代码提供了一个警告,关于"从初始化程序返回而不初始化所有存储的属性"。
对于示例B ,我尝试使用guard语句进行可选链接,如下所示:
struct Location {
let name: String
let tzs: String
let lat: String
let lon: String
init(jsonDict: [String: AnyObject]) {
guard
let name = jsonDict["name"] as? String,
let tzs = jsonDict["tzs"] as? String,
let lat = jsonDict["lat"] as? String,
let lon = jsonDict["lon"] as? String
else {
self.name = "no"
self.tzs = "no"
self.lat = "no"
self.lon = "no"
return
}
self.name = name
self.tzs = tzs
self.lat = lat
self.lon = lon
}
}
示例B 中的可选链接方法有效,但它要求guard语句中的所有检查都为true。如果其中一个变量不在JSON数据中,则整个语句将为false。例如,如果tzs
中不存在jsonDict
,那么所有属性都将为" no"。
我正在Playground中运行所有这些代码(如果重要的话)。
如果一个或多个属性不在JSON字典中,我怎样才能示例A 初始化struct
?
答案 0 :(得分:4)
使用nil coalescing operator(??
):
init(jsonDict: [String: AnyObject]) {
name = jsonDict["name"] as? String ?? "none"
tzs = jsonDict["tzs"] as? String ?? "none"
lat = jsonDict["lat"] as? String ?? "none"
lon = jsonDict["lon"] as? String ?? "none"
}
nil合并算子(a ?? b)打开一个可选的a if 包含一个值,如果a为nil,则返回默认值b。该 表达式a始终是可选类型。表达式b必须 匹配存储在。
中的类型
或者,当然,您可以将属性设置为可选,并替换" none"字符串,如果你去其他地方访问它们时可选的是nil(例如,当你向用户显示这个位置时)。