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(来自解码器:解码器) 备注:在任何catch子句中定义了隐式变量错误, } catch { print(error.localizedDescription) } 可以提供更多信息,而不仅仅是一个打印(“错误”)(虽然不是在这个特殊的情况下). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |