Ios Swift 4可编码,编码键仅用于解码
Ios Swift 4可编码,编码键仅用于解码,ios,swift,swift4,codable,Ios,Swift,Swift4,Codable,CodingKey是否可以仅用于jsonecoder和JSONDecoder使用默认成员名称 例如,我有以下结构 var str = """ { "name": "Endeavor", "abv": 8.9, "brewery": "Saint Arnold", "style": "ipa" } """ enum BeerStyle:String,Codable { case ipa case stout case kolsch } struct Beer : Co
CodingKey
是否可以仅用于jsonecoder
和JSONDecoder
使用默认成员名称
例如,我有以下结构
var str = """
{
"name": "Endeavor",
"abv": 8.9,
"brewery": "Saint Arnold",
"style": "ipa"
}
"""
enum BeerStyle:String,Codable {
case ipa
case stout
case kolsch
}
struct Beer : Codable {
let name : String
let brewery : String
let style : BeerStyle
let abv : Float
// THIS SHOULD BE USED ONLY FOR JSONEncoder ?
enum CodingKeys:String,CodingKey {
case name
case abv = "alcohol_by_volume"
case brewery = "brewery_name"
case style
}
}
let jsonData = str.data(using: .utf8)!
let decoder = JSONDecoder() // how to to make it not to use Coding key
let beer = try! decoder.decode(Beer.self, from: jsonData)
将无法正常工作,因为存在enum CodingKey:String,CodingKey
有人能给我建议一个想法或链接吗 试试这个:
编码键
和解码键
init(从解码器:解码器)
和encode(到编码器:编码器)
实现如下我只用了一个
encode(…)
的实现就试过了。您只需将枚举重命名为EncodingKeys.self
(或其他名称)。然后实现如上所述的编码功能。用于解码的编码键和init函数正在合成。(这不是“kolsch”,谢谢回答!!,encode
函数将用于JSONDecoder
或jsonecoder
。encode
函数使用jsonecoder
实现自定义编码,顾名思义:)您的答案在某种程度上是正确的,但我要问的是CodingKey
enum可用于jsonecoder
仅用于解码器我不需要额外的enum是的,正如我在更新答案时所写:将您的enum重命名为EncodingKeys
。因此,您可以将其用于jsonecoder
,并使用func encode(to encoder:encoder)的自定义实现。
就像上面截取的代码一样。重命名后,不再有CodingKeys
enum,因此编译器会在后台生成一个用于jsondeconder
的枚举。这些编码键将是非默认键,因此将与属性名相同。如果我使用两个枚举,一个用于编码器,一个用于解码器,那么它可以正常工作。作为。您说过,对于json解码器,它将在后台创建无法工作的枚举!!请在代码中添加示例
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: EncodingKeys.self)
try container.encode(name, forKey: .name)
// ...
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: DecodingKeys.self)
name = try values.decode(String.self, forKey: .name)
// ...
}