enum PostType: Decodable {
init(from decoder: Decoder) throws {
// What do i put here?
}
case Image
enum CodingKeys: String, CodingKey {
case image
}
}
O que eu coloco para concluir isso? Além disso, digamos que eu mudei o case
para isso:
case image(value: Int)
Como faço para que isso esteja em conformidade com Decodable?
Editar Aqui está o meu código completo (que não funciona)
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
}
Edição final Além disso, como ele lida com uma enumeração como esta?
enum PostType: Decodable {
case count(number: Int)
}
iOS 13.3
. Eu testeiiOS 13.3
eiOS 12.4.3
eles se comportam de maneira diferente. SobiOS 13.3
, enum pode ser en- / decodificado apenas.Como fazer com que as enums com tipos associados estejam em conformidade com
Codable
Esta resposta é semelhante à de HowHow Lovatt, mas evita a criação de uma
PostTypeCodableForm
estrutura e, em vez disso, usa oKeyedEncodingContainer
tipo fornecido pela Apple como uma propriedade emEncoder
eDecoder
, o que reduz o padrão.Este código funciona para mim no Xcode 9b3.
fonte
Either
codificávelSwift lançaria um
.dataCorrupted
erro se encontrar um valor de enumeração desconhecido. Se seus dados vierem de um servidor, eles poderão enviar um valor de enumeração desconhecido a qualquer momento (erro no servidor, novo tipo adicionado em uma versão da API e você deseja que as versões anteriores do seu aplicativo lidem com o caso normalmente, etc.), é melhor você estar preparado e codificar "estilo defensivo" para decodificar com segurança seus enums.Aqui está um exemplo de como fazê-lo, com ou sem valor associado
E como usá-lo em uma estrutura anexa:
fonte
Para estender a resposta de @ Toka, você também pode adicionar um valor representável bruto à enumeração e usar o construtor opcional padrão para criar a enumeração sem
switch
:Pode ser estendido usando um protocolo personalizado que permite refatorar o construtor:
Também pode ser facilmente estendido para gerar um erro se um valor de enum inválido foi especificado, em vez de usar como padrão um valor. A lista principal com esta alteração está disponível aqui: https://gist.github.com/stephanecopin/4283175fabf6f0cdaf87fef2a00c8128 .
O código foi compilado e testado usando o Swift 4.1 / Xcode 9.3.
fonte
Uma variante da resposta do @ proxpero que é terser seria formular o decodificador como:
Isso permite que o compilador verifique exaustivamente os casos e também não suprime a mensagem de erro para o caso em que o valor codificado não corresponde ao valor esperado da chave.
fonte
Na verdade, as respostas acima são realmente ótimas, mas faltam alguns detalhes para o que muitas pessoas precisam em um projeto cliente / servidor desenvolvido continuamente. Desenvolvemos um aplicativo enquanto nosso back-end evolui continuamente ao longo do tempo, o que significa que alguns casos de enum mudarão essa evolução. Portanto, precisamos de uma estratégia de decodificação de enumeração capaz de decodificar matrizes de enumerações que contêm casos desconhecidos. Caso contrário, a decodificação do objeto que contém a matriz simplesmente falha.
O que eu fiz é bem simples:
Bônus: ocultar implementação> Criar uma coleção
Ocultar os detalhes da implementação é sempre uma boa ideia. Para isso, você precisará de um pouco mais de código. O truque consiste em conformar
DirectionsList
aCollection
e faça a sua internalist
variedade privada:Você pode ler mais sobre a conformidade com coleções personalizadas nesta postagem de blog de John Sundell: https://medium.com/@johnsundell/creating-custom-collections-in-swift-a344e25d0bb0
fonte
Você pode fazer o que quiser, mas está um pouco envolvido :(
fonte