Regresar desde el inicializador sin inicializar todas las properties almacenadas.

Tengo una class simple como esta.

public class User { let id: Int let firstName: String let lastName: String let email: String? init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } 

Esto compiló muy bien en la versión anterior de Swift. En Swift 1.2, obtengo el siguiente error de compilation.

Regresar desde el inicializador sin inicializar todas las properties almacenadas.

¿Por qué es eso y cómo puedo resolverlo?

Si una propiedad es constante, entonces creada con let , tienes que inicializarla en su lugar o en el método init , incluso si es Optional . Si desea poder configurar el correo electrónico de forma opcional, debe cambiar let to var . En otras palabras, si no está inicializando una variable en el método init o en el cuerpo de la class, la variable debe ser tanto una var como una Optional .

Declaraciones relacionadas en los documentos :

Puede asignar un valor a una propiedad constante en cualquier punto durante la initialization, siempre que se establezca en un valor definido en el momento en que finalice la initialization. Una vez que se asigna un valor a una propiedad constante, no se puede modificar más.

Para las instancias de class, una propiedad constante solo puede ser modificada durante la initialization por la class que la presenta. No puede ser modificado por una subclass.

Debe establecer explícitamente un valor para el correo electrónico, ya que es una constante.

 public class User { let id: Int let firstName: String let lastName: String let email: String? init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName self.email = nil // <-------------- } } 

O como los otros mencionados, puedes cambiar el correo electrónico a una variable.

La regla de oro es:

  • Si lo ha dejado, debe inicializarlo (incluso si es opcional). Por ejemplo: let email: String
  • Si tiene una var no opcional , debe inicializar. Por ejemplo, var email: String
  • Si tiene una var opcional, no necesita inicializarla. Por ejemplo, var email: String?

Cambie el correo electrónico de "let" a "var" como se muestra a continuación.

 public class User { let id: Int let firstName: String let lastName: String var email: String? init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } 

En primer lugar, quede claro que a cada variable let se le debe asignar un valor en el momento de la statement. Entonces tus declaraciones serán

 let id: Int = 0 let firstName: String = "test" let lastName: String = "Test" let email: String? = "Test" 

En segundo lugar, en las classs, debe tener que inicializar variables o definirlas como types opcionales poniendo '?' o '!' con cada variable Me gusta

 let id: Int! let firstName: String! let lastName: String! let email: String? 

o

 let id: Int? let firstName: String? let lastName: String? let email: String? 

Pero quiero decirte aquí que estas variables no podrán cambiar ya que son constantes. por lo que debe usar var con estos si no está pasando el valor al momento de la statement. Su código final en este caso será algún tipo de esto

 var id: Int var firstName: String var lastName: String var email: String?