加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – Codable / Decodable应该使用字符串解码数组

发布时间:2020-12-14 04:31:58 所属栏目:百科 来源:网络整理
导读:为什么名称Array不能解码? 准备好游乐场,简单地将它粘贴到你的操场上 import Foundationstruct Country : Decodable { enum CodingKeys : String,CodingKey { case names } var names : [String]?}extension Country { public init(from decoder: Decoder)
为什么名称Array不能解码?

准备好游乐场,简单地将它粘贴到你的操场上

import Foundation

struct Country : Decodable {

    enum CodingKeys : String,CodingKey {
        case names
    }

    var names : [String]?
}

extension Country {
    public init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        names = try values.decode([String]?.self,forKey: .names)!
    }
}

let json = """
 [{
    "names":
      [
       "Andorre","Andorra","アンドラ"
      ]
 },{
    "names":
      [
       "United Arab Emirates","Vereinigte Arabische Emirate","émirats Arabes Unis","Emiratos árabes Unidos","アラブ首長国連邦","Verenigde Arabische Emiraten"
      ]
  }]
""".data(using: .utf8)!

let decoder = JSONDecoder()
do {
    let countries = try decoder.decode([Country].self,from: json)
    countries.forEach { print($0) }
} catch {
    print("error")
}

解决方法

您已将名称定义为Country的可选属性.
如果您的意图是该密钥可能不存在于JSON中
然后使用decodeIfPresent:

extension Country {
    public init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        names = try values.decodeIfPresent([String].self,forKey: .names)
    }
}

如果容器没有与key关联的值,或者值为null,则此方法返回nil.

但实际上你可以省略你的自定义init(来自解码器:解码器)
实现(和枚举CodingKeys),因为这是默认行为而且会
自动合成.

备注:在任何catch子句中定义了隐式变量错误,
所以

} catch {
    print(error.localizedDescription)
}

可以提供更多信息,而不仅仅是一个打印(“错误”)(虽然不是在这个特殊的情况下).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读