enum PostType: Decodable {
init(from decoder: Decoder) throws {
// What do i put here?
}
case Image
enum CodingKeys: String, CodingKey {
case image
}
}
¿Qué pongo para completar esto? Además, digamos que cambié case
esto a esto:
case image(value: Int)
¿Cómo hago que esto se ajuste a Decodable?
EDITAR Aquí está mi código completo (que no 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
}
Edición final Además, ¿cómo manejará una enumeración como esta?
enum PostType: Decodable {
case count(number: Int)
}
iOS 13.3
. PrueboiOS 13.3
yiOS 12.4.3
, se comportan de manera diferente. DebajoiOS 13.3
, enum se puede decodificar / decodificar únicamente.Cómo hacer que las enumeraciones con tipos asociados se ajusten a
Codable
Esta respuesta es similar a la de @Howard Lovatt, pero evita crear una
PostTypeCodableForm
estructura y en su lugar utiliza elKeyedEncodingContainer
tipo proporcionado por Apple como una propiedad enEncoder
yDecoder
, lo que reduce la repetitiva.Este código funciona para mí en Xcode 9b3.
fuente
Either
codificablesSwift arrojaría un
.dataCorrupted
error si encuentra un valor de enumeración desconocido. Si sus datos provienen de un servidor, puede enviarle un valor de enumeración desconocido en cualquier momento (lado del servidor de errores, nuevo tipo agregado en una versión de API y desea que las versiones anteriores de su aplicación manejen el caso con gracia, etc.), será mejor que esté preparado y codifique "estilo defensivo" para decodificar sus enumeraciones de forma segura.Aquí hay un ejemplo sobre cómo hacerlo, con o sin valor asociado
Y cómo usarlo en una estructura envolvente:
fuente
Para ampliar la respuesta de @ Toka, también puede agregar un valor representable sin formato a la enumeración y utilizar el constructor opcional predeterminado para generar la enumeración sin un
switch
:Se puede ampliar utilizando un protocolo personalizado que permite refactorizar el constructor:
También se puede extender fácilmente para generar un error si se especificó un valor de enumeración no válido, en lugar de omitir un valor. Lo esencial de este cambio está disponible aquí: https://gist.github.com/stephanecopin/4283175fabf6f0cdaf87fef2a00c8128 .
El código fue compilado y probado usando Swift 4.1 / Xcode 9.3.
fuente
Una variante de la respuesta de @ proxpero que es más terser sería formular el decodificador como:
Esto permite que el compilador verifique exhaustivamente los casos, y tampoco suprime el mensaje de error para el caso donde el valor codificado no coincide con el valor esperado de la clave.
fuente
En realidad, las respuestas anteriores son realmente geniales, pero les faltan algunos detalles de lo que mucha gente necesita en un proyecto cliente / servidor desarrollado continuamente. Desarrollamos una aplicación mientras nuestro backend evoluciona continuamente con el tiempo, lo que significa que algunos casos de enumeración cambiarán esa evolución. Por lo tanto, necesitamos una estrategia de decodificación de enumeración que sea capaz de decodificar matrices de enumeraciones que contienen casos desconocidos. De lo contrario, la decodificación del objeto que contiene la matriz simplemente falla.
Lo que hice es bastante simple:
Bonificación: Ocultar implementación> Convertirla en una colección
Ocultar detalles de implementación es siempre una buena idea. Para esto necesitarás un poco más de código. El truco consiste en conformar
DirectionsList
aCollection
y hacer que su interiorlist
serie privada:Puede leer más sobre la conformidad con las colecciones personalizadas en esta publicación de blog de John Sundell: https://medium.com/@johnsundell/creating-custom-collections-in-swift-a344e25d0bb0
fuente
Puedes hacer lo que quieras, pero es un poco complicado :(
fuente