在Swift struct中使用guard不会初始化所有属性

时间:2015-11-25 02:31:24

标签: json swift struct swift2 optional

对于示例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

1 个答案:

答案 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(例如,当你向用户显示这个位置时)。