Codificado ''no tiene inicializadores'' en Xcode 9.3(Swift 4.1)
codable swift4.1 (4)
Después de actualizar a Xcode 9.3 (que usa Swift 4.1), se encontró el siguiente problema:
Cree un proyecto vacío, agregue un nuevo archivo .swift y cree dos nuevas clases:
class CodableOne: Codable { let some: String } class CodableTwo: Codable { var some: String }
La construcción tiene éxito
Agregue una nueva constante a
CodableOne
de tipoCodableTwo
:class CodableOne: Codable { let some: String let another: CodableTwo } class CodableTwo: Codable { var some: String }
La construcción tiene éxito
Ahora mueva la clase
CodableTwo
a otro archivo (ViewController.swift, por ejemplo)Build falla
Ahora hay un error, que no desaparecerá. Codable
clases Codable
no deberían requerir inicializadores (como se demostró en los pasos anteriores).
Cualquier idea sobre lo que podría ser el problema detrás de esto y cómo podría resolverse será muy apreciada.
El problema de PS no está presente en Xcode 9.2. Tampoco se limpia la ruta del proyecto / compilación, ni tampoco se puede volver a instalar Xcode 9.3.
Como mencioné en los comentarios , tuve que hacer dos cosas:
cambiando el modo de compilación a todo el módulo dentro de la configuración del proyecto / configuración de compilación :
reordenando los archivos en Configuración del proyecto / Fases de compilación / Fuentes de compilación . Específicamente, traje los archivos que tenían un error al frente de la lista.
Protip: si busca el nombre del archivo y hay más de un resultado, arrastrar el archivo a la parte superior en esa lista más pequeña todavía lo traerá al frente.
Este es un error en el compilador de Swift 4.1
. Para solucionarlo, realice los pasos descritos en la respuesta de 4kman o simplemente cambie let
a var
en su declaración, como tal:
class C1 : Decodable {
let str: String
// error: Class ''C1'' has no initializers - if class C''s `c1` is a let constant.
}
class C : Decodable {
var c1: C1 // << Change to `var`, compilation succeeds.
}
Solución alternativa bugs.swift.org/browse/SR-7315 .
Si ni esta ni la respuesta de 4kmans te ayudan, puedes agregar otro init
a los modelos que no compilarán. Si sus clases tienen toneladas de variables, simplemente bloquee el init
para satisfacer al compilador. El inicializador Codable
seguirá sintetizado.
class C1: Decodable {
let str: String
@available(*, deprecated, message: "Do not use.")
private init() {
fatalError("Swift 4.1")
}
}
intenta darle a tu variable un valor inicial como este (cambia tu código a este)
class CodableOne: Codable{
var some = ""
}
class CodableTwo: Codable{
var some = ""
}
tuve este problema a pesar de que todas mis clases estaban en el mismo archivo, pero el uso de estructuras para las más profundas parece funcionar