Sobes.tech
Middle

Qual é a diferença entre os inicializadores convention e designated em Swift?

sobes.tech IA

Resposta da IA

  • Inicializador Designado: O inicializador principal, "de base", na classe. Deve inicializar completamente todas as propriedades armazenadas próprias da classe, e depois chamar o inicializador designado da superclasse (através de super.init). Cada classe deve ter pelo menos um inicializador designado.

  • Inicializador de Conveniência: Um inicializador auxiliar destinado a simplificar a criação de instâncias da classe em certos cenários. Deve chamar outro inicializador da mesma classe — seja um designado ou de conveniência. No final, a cadeia de chamadas de inicializadores de conveniência deve conduzir à chamada do inicializador designado na mesma classe. Os inicializadores de conveniência não são obrigatórios.

Aqui está o esquema de delegação de inicialização:

Convenience -> Designado (na mesma classe)
Designado -> Designado (na classe pai)

Exemplo:

class MyClass {
    var value: Int
    var name: String

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

    // Inicializador de conveniência
    convenience init(value: Int) {
        self.init(value: value, name: "DefaultName") // Chama o inicializador designado na mesma classe
    }

    // Outro inicializador de conveniência
    convenience init(name: String) {
        self.init(value: 0, name: name) // Chama o inicializador designado na mesma classe
    }
}

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

A diferença chave reside no seu papel na cadeia de inicialização e nas regras de delegação: o inicializador designado garante a inicialização completa das suas propriedades e delega a inicialização do pai, enquanto que o de conveniência simplifica a criação de instâncias delegando a outro inicializador na mesma classe, que por sua vez chama o inicializador designado.