Swift: propiedad no inicializada en llamada super.init

Estoy haciendo un pequeño keyboard personalizado y tengo un set de variables dentro de la class que deben inicializarse dentro de 'override init ()' como se puede ver a continuación:

class KeyboardViewController: UIInputViewController { var button01: CharacterButton var button02: CharacterButton ... 

y

 override init() { //Initialize buttons and assign attributes button01 = CharacterButton.createButton("Q", labelOfButton: "Q") button02 = CharacterButton.createButton("W‎", labelOfButton: "W") super.init() } 

Además de eso, también agregué el siguiente código, ya que aparentemente se requiere desde Xcode 6 beta 5:

 requinetworking init(coder aDecoder: NSCoder!) { super.init(coder: aDecoder) } 

Pero ese último fragment de código da como resultado un error que dice:

La propiedad 'self.button01' no se inicializó en la llamada super.init

¿Por qué sucedería esto cuando ya haya inicializado 'button01' y haya llamado a 'super.init ()' dentro de la antigua function 'override init ()'? Esto me está volviendo loco.

init(coder:) y init() son dos inicializadores designados diferentes. Tienes pocas opciones aquí. Lo mejor sería inicializar sus properties en el lugar.

 class KeyboardViewController: UIInputViewController { var button01 = CharacterButton.createButton("Q", labelOfButton: "Q") var button02 = CharacterButton.createButton("W‎", labelOfButton: "W") } 

EDITAR:

Eliminó los inicializadores del código anterior. Si todas las properties se inicializan en el lugar, no hay necesidad de anular ningún inicializador. Todos ellos simplemente se henetworkingarán automáticamente (incluido init(coder:) ).


O puede hacer algo como esto, si su class nunca se va a crear a partir de nibs (incluidos storyboards:

  class KeyboardViewController: UIInputViewController { ... requinetworking init(coder aDecoder: NSCoder!) { fatalError("This class doesn't support NSCoding.") } } 

No me gusta esta solución, ya que rompe la promise de la superclass sobre la implementación de NSCoding, pero 'funciona'. Finalmente, puede hacer que sus properties sean opcionales desempaquetados implícitamente.

 class KeyboardViewController: UIInputViewController { var button01: CharacterButton! var button02: CharacterButton! ... } 

Pero si lo haces, tu init(coder:) se convertirá en inseguro, por lo que es mejor lanzar fatalError desde allí y fatalError a non-opcionales.

Esto sucede porque si la class se crea con el segundo inicializador

 init(coder aDecoder: NSCoder!) 

entonces sus variables button01 y button02 nunca se inicializan. Y dado que no son opcionales, el comstackdor no lo permite.

Puede cambiar el segundo inicializador a algo como esto:

 requinetworking init(coder aDecoder: NSCoder!) { button01 = CharacterButton.createButton("Q", labelOfButton: "Q") button02 = CharacterButton.createButton("W‎", labelOfButton: "W") super.init(coder: aDecoder) } 

O puede inicializar variables cuando se declaran:

 var button01 = CharacterButton.createButton("Q", labelOfButton: "Q") var button02 = CharacterButton.createButton("W‎", labelOfButton: "W") 

Si no estás interesado en implementar init(coder:) , deberías lanzar un error.

 requinetworking init(coder aDecoder: NSCoder!) { fatalError("use init() method") } 

No estoy seguro de si el sistema invoca init(coder:) para las UIInputViewController .