Un designated initializer inicializa todos los stored properties y llama al init del padre. Un convenience initializer llama a otro init del mismo tipo (con self.init) y simplifica casos de uso habituales:
class Persona {
let nombre: String
let edad: Int
// Designated
init(nombre: String, edad: Int) {
self.nombre = nombre
self.edad = edad
}
// Convenience
convenience init(nombre: String) {
self.init(nombre: nombre, edad: 0)
}
}
let adulto = Persona(nombre: "Ana", edad: 30)
let bebe = Persona(nombre: "Leo") // edad = 0
Las dos fases de inicialización en herencia
Fase 1: cada stored property obtiene su valor. Fase 2: personalización. Esta regla impide usar self antes de que todos los stores estén inicializados:
class Animal {
let especie: String
init(especie: String) { self.especie = especie }
}
class Perro: Animal {
let raza: String
init(raza: String) {
self.raza = raza // fase 1: inicializar propiedad propia
super.init(especie: "Canis lupus") // fase 1: delegar al padre
print("Perro (raza) listo") // fase 2: personalización
}
}
let d = Perro(raza: "Labrador")
