gpt4 book ai didi

swift - Swift 4 中 Codable 协议(protocol)的自定义字典编码器和解码器

转载 作者:搜寻专家 更新时间:2023-10-30 21:59:52 25 4
gpt4 key购买 nike

如果我有一个符合 Codable 的结构像这样的协议(protocol):

enum AnimalType: String, Codable {
case dog
case cat
case bird
case hamster
}

struct Pet: Codable {
var name: String
var animalType: AnimalType
var age: Int
var ownerName: String
var pastOwnerName: String?
}

我如何创建一个编码器和一个解码器,将它编码/解码到/从一个类型的实例 Dictionary<String, Any?>像这样?

let petDictionary: [String : Any?] = [
"name": "Fido",
"animalType": "dog",
"age": 5,
"ownerName": "Bob",
"pastOwnerName": nil
]
let decoder = DictionaryDecoder()
let pet = try! decoder.decode(Pet.self, for: petDictionary)

注意:我知道可以使用 JSONEncoderJSONDecoder将结果转换为字典对象之前的类,但出于效率原因我不希望这样做。

Swift 标准库附带 JSONEncoderJSONDecoder以及 PListEncoderPListDecoder开箱即用的类符合 EncoderDecoder分别协议(protocol)。

我的问题是我不知道如何为我的自定义编码器和解码器类实现这些协议(protocol):

class DictionaryEncoder: Encoder {

var codingPath: [CodingKey]

var userInfo: [CodingUserInfoKey : Any]

func container<Key>(keyedBy type: Key.Type) -> KeyedEncodingContainer<Key> where Key : CodingKey {

}

func unkeyedContainer() -> UnkeyedEncodingContainer {

}

func singleValueContainer() -> SingleValueEncodingContainer {

}
}
class DictionaryDecoder: Decoder {

var codingPath: [CodingKey]

var userInfo: [CodingUserInfoKey : Any]

func container<Key>(keyedBy type: Key.Type) throws -> KeyedDecodingContainer<Key> where Key : CodingKey {

}

func unkeyedContainer() throws -> UnkeyedDecodingContainer {

}

func singleValueContainer() throws -> SingleValueDecodingContainer {

}
}

鉴于 Swift 是开源的,可以查看 JSONEncoder 的源代码和 PListEncoder标准库中的类,但由于除了一些注释外缺乏文档,源文件很大且难以理解。

最佳答案

如果您查看 JSONDecoder ( here ) 的实现,您会发现它有两个步骤:1. 使用 JSONSerializationData 到一个 json 字典,然后 2. 创建一个内部类 _JSONDecoder 的实例来做字典 -> Codable 对象转换。

some discussion on the Swift forums关于可能暴露内部类型的问题,Swift 团队可能会在未来做一些事情。有人还提供了一个第 3 方框架来做你想做的事。

关于swift - Swift 4 中 Codable 协议(protocol)的自定义字典编码器和解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46830674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com