Если у меня есть структура, соответствующая протоколу Codable
, например:
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)
Примечание: я знаю, что можно использовать классы JSONEncoder
и JSONDecoder
перед преобразованием результата в объект словаря, но я не хочу этого из соображений эффективности.
Стандартная библиотека Swift поставляется с классами JSONEncoder
и JSONDecoder
, а также с классами PListEncoder
и PListDecoder
прямо из коробки, которые соответствуют протоколам Encoder
и Decoder
соответственно.
Моя проблема в том, что я понятия не имею, как реализовать эти протоколы для моих пользовательских классов кодировщика и декодера:
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 в стандартной библиотеке, но исходные файлы огромны и трудны для понимания из-за отсутствия документации, за исключением нескольких комментариев.
Encoder
иDecoder
, которые вы можете реализовать для создания собственного пользовательского кодировщика и декодера для протокола Codable. Стандартная библиотека Swift поставляется с двумя такими парами кодировщик/декодер: github.com/apple/swift/blob/master/stdlib/public/SDK/Foundation/ github.com/apple/swift/blob/master/stdlib/public/SDK/Foundation/ - person Toni Sučić   schedule 20.10.2017Encoder
иDecoder
соответственно. - person Toni Sučić   schedule 20.10.2017