Sobes.tech
Middle

¿Cuál es la diferencia entre los inicializadores convention y designated en Swift?

sobes.tech AI

Respuesta de la IA

  • Inicializador Designado: El inicializador principal, "básico", en la clase. Debe inicializar completamente todas las propiedades almacenadas propias de la clase, y luego llamar al inicializador designado del superclase (a través de super.init). Cada clase debe tener al menos un inicializador designado.

  • Inicializador de Conveniencia: Un inicializador auxiliar destinado a simplificar la creación de instancias de la clase en ciertos escenarios. Debe llamar a otro inicializador del mismo clase — ya sea un inicializador designado o de conveniencia. En última instancia, la cadena de llamadas de inicializadores de conveniencia debe conducir a la llamada al inicializador designado en la misma clase. Los inicializadores de conveniencia no son obligatorios.

Aquí está el esquema de delegación de inicialización:

Convenience -> Designado (en la misma clase)
Designado -> Designado (en la clase padre)

Ejemplo:

class MyClass {
    var value: Int
    var name: String

    // Inicializador designado
    init(value: Int, name: String) {
        self.value = value
        self.name = name
    }

    // Inicializador de conveniencia
    convenience init(value: Int) {
        self.init(value: value, name: "DefaultName") // Llama al inicializador designado en la misma clase
    }

    // Otro inicializador de conveniencia
    convenience init(name: String) {
        self.init(value: 0, name: name) // Llama al inicializador designado en la misma clase
    }
}

let instance1 = MyClass(value: 10, name: "Custom")
let instance2 = MyClass(value: 5)
let instance3 = MyClass(name: "Another")

La diferencia clave radica en su papel en la cadena de inicialización y las reglas de delegación: el inicializador designado garantiza la inicialización completa de sus propiedades y delega la inicialización del padre, mientras que el de conveniencia simplifica la creación de instancias delegando a otro inicializador en la misma clase, que en última instancia llama al inicializador designado.