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.