【问题标题】:Swift parse dictionary with guard statements带有保护语句的 Swift 解析字典
【发布时间】:2016-10-25 04:32:58
【问题描述】:

JSON 调用返回一个字典,如下所示。这两个值中的任何一个或“secondLevel”字典本身都可能丢失。

{
   "theMain" : {
      "secondLevel" : {
         "value1" : "5.3",
         "value2" : "bbb"
      }
   }
}

我正在使用保护语句进行解析:

guard let main = theJson["theMain"] as? [String : Any] else {
    return
}
guard let second = main["secondLevel"] as? [String : Any] else {
    let second = [String : Any]()
}
guard second.count > 0,
    let firstValue = second["value1"] as? String else {
        let firstValue = "n/a"
}
guard second.count > 0,
    let secondValue = second["value2"] as? String else {
        let secondValue = "n/a"
}

有没有更好的方法来做到这一点?

【问题讨论】:

  • 如果你想要一个每个字段的错误处理过程,那么不。如果允许有一个共享的错误处理过程(例如从一个可保释的初始化程序返回nil),那么所有的保护语句都可以组合起来。

标签: json swift dictionary


【解决方案1】:

更好的方法是使用 one 保护语句来检查键 theMainsecondLevel 以及 secondLevel 字典中的项目数是否 > 0。

由于secondLevel 字典仅包含字符串值,请将其转换为[String : String],以避免进一步向下转换。

如果缺少键,最后使用 nil-coalescing 运算符分配 n/a。

guard let main = theJson["theMain"] as? [String : Any], 
      let second = main["secondLevel"] as? [String : String], !second.isEmpty {
        return
}

let firstValue = second["value1"] ?? "n/a"
let secondValue = second["value2"] ?? "n/a"

【讨论】:

  • 不太适合我的用途,因为如果second 为空,我仍然希望这两个值是"n/a"。不过,对我来说一些很棒的信息! (改进强制转换、空合并运算符和 dictionary.isEmpty 快捷方式)
  • 如果second 为空,恐怕您的示例代码不会将n/a 分配给这两个值。如果条件为真,guard second.count > 0 会跳过后面大括号中的代码。要获取 n/a 如果 second 为空,只需删除最后一个检查 , !second.isEmpty
【解决方案2】:

借鉴@vadian 的answer 的优秀想法,尤其是nil coalescing operator 和更好的演员阵容,这对我有用:

guard let main = incoming["theMain"] as? [String : Any] else {
    return
}
let second = main["secondLevel"] as? [String : String] ?? [String : String]()
let firstValue = second["value1"] ?? "n/a"
let secondValue = second["value2"] ?? "n/a"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-25
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多