Swift 4 Codable,CodingKey仅用于解码

时间:2018-02-06 10:20:22

标签: ios swift swift4 codable

CodingKey是否可以仅用于JSONEncoder,而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 CodingKeys:String,CodingKey存在

将无法正常工作

任何人都可以向我推荐一个想法或链接?

1 个答案:

答案 0 :(得分:2)

试试这个:

  1. 添加两个用于编码的枚举和一个用于解码的枚举,例如: EncodingKeysDecodingKeys
  2. 像这样编写自定义init(from decoder: Decoder)encode(to encoder: Encoder)实现。
  3. 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)
        // ...
    }
    

    <强>更新 我只使用encode(...)的一个实现尝试了它。您只需要将Enum重命名为EncodingKeys.self(或其他内容)。然后实现如上所述的编码功能。为了解码,正在合成CodingKeys和init-function。