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)
        // ...
    }