enum PostType: Decodable {
init(from decoder: Decoder) throws {
// What do i put here?
}
case Image
enum CodingKeys: String, CodingKey {
case image
}
}
Что я положу, чтобы завершить это? Кроме того, допустим, я изменил на case
это:
case image(value: Int)
Как мне сделать это соответствует Decodable?
EDit Вот мой полный код (который не работает)
let jsonData = """
{
"count": 4
}
""".data(using: .utf8)!
do {
let decoder = JSONDecoder()
let response = try decoder.decode(PostType.self, from: jsonData)
print(response)
} catch {
print(error)
}
}
}
enum PostType: Int, Codable {
case count = 4
}
Final Edit Кроме того, как он будет обрабатывать перечисление, как это?
enum PostType: Decodable {
case count(number: Int)
}
iOS 13.3
. Я проверяюiOS 13.3
иiOS 12.4.3
они ведут себя по-разному. ПодiOS 13.3
enum можно только расшифровать / расшифровать.Как сделать перечисления со связанными типами соответствующими
Codable
Этот ответ похож на @Howard Lovatt, но избегает создания
PostTypeCodableForm
структуры и вместо этого используетKeyedEncodingContainer
тип, предоставленный Apple, в качестве свойства дляEncoder
иDecoder
, что уменьшает шаблон.Этот код работает для меня на Xcode 9b3.
источник
Either
кодируемыйSwift выдаст
.dataCorrupted
ошибку, если встретит неизвестное значение перечисления. Если ваши данные поступают с сервера, он может отправить вам неизвестное значение перечисления в любое время (ошибка сервера, новый тип, добавленный в версию API, и вы хотите, чтобы предыдущие версии вашего приложения корректно обрабатывали этот случай, и т. Д.), Вы должны быть готовы и кодировать «оборонительный стиль», чтобы безопасно расшифровать ваши перечисления.Вот пример того, как это сделать, с или без связанного значения
И как использовать это во вложенной структуре:
источник
Чтобы расширить ответ @ Toka, вы также можете добавить в перечисление необработанное представимое значение и использовать необязательный конструктор по умолчанию для создания перечисления без
switch
:Он может быть расширен с помощью пользовательского протокола, который позволяет реорганизовать конструктор:
Это также может быть легко расширено для выдачи ошибки, если было указано недопустимое значение перечисления, вместо значения по умолчанию для значения. С этим изменением можно ознакомиться здесь: https://gist.github.com/stephanecopin/4283175fabf6f0cdaf87fef2a00c8128 .
Код был скомпилирован и протестирован с использованием Swift 4.1 / Xcode 9.3.
источник
Вариант ответа @ proxpero, который является более кратким, состоит в том, чтобы сформулировать декодер как:
Это позволяет компилятору исчерпывающе проверять случаи, а также не подавляет сообщение об ошибке для случая, когда закодированное значение не соответствует ожидаемому значению ключа.
источник
На самом деле ответы выше действительно хороши, но в них отсутствуют некоторые детали того, что нужно многим людям в постоянно развивающемся проекте клиент / сервер. Мы разрабатываем приложение, в то время как наш бэкэнд постоянно развивается с течением времени, что означает, что некоторые перечисленные случаи изменят эту эволюцию. Поэтому нам нужна стратегия декодирования перечислений, которая способна декодировать массивы перечислений, которые содержат неизвестные регистры. В противном случае декодирование объекта, содержащего массив, просто не удастся.
То, что я сделал, довольно просто:
Бонус: Скрыть реализацию> Сделать коллекцию
Скрывать детали реализации всегда хорошая идея. Для этого вам понадобится немного больше кода. Хитрость заключается в том, чтобы соответствовать ,
DirectionsList
чтобыCollection
и сделать свой внутреннийlist
массив частным:Вы можете прочитать больше о соответствии пользовательских коллекций в этом сообщении в блоге Джона Санделла: https://medium.com/@johnsundell/creating-custom-collections-in-swift-a344e25d0bb0
источник
Вы можете делать то, что вы хотите, но это немного связано :(
источник