Aula 22: Inicialização e Desinicialização em Swift
Em Swift, toda classe, estrutura e enumeração possui um inicializador que configura o estado inicial de uma instância. Além disso, a desinicialização é um processo de execução de limpeza pouco antes de uma instância ser desalocada. Nesta aula, abordaremos como utilizar efetivamente a inicialização e a desinicialização em Swift.
Inicialização
1. Inicialização Básica
Em Swift, você define um inicializador usando a palavra-chave init
. Aqui está um exemplo simples:
class Pessoa {
var nome: String
var idade: Int
// Inicializador
init(nome: String, idade: Int) {
self.nome = nome
self.idade = idade
}
}
// Criando uma instância da Pessoa
let pessoa = Pessoa(nome: "Alice", idade: 30)
print("Nome: \(pessoa.nome), Idade: \(pessoa.idade)")
2. Inicializadores Padrão
Se todas as propriedades de uma classe ou estrutura têm valores padrão, um inicializador padrão é fornecido automaticamente:
class Cachorro {
var nome: String = "Desconhecido"
var idade: Int = 0
}
let cachorro = Cachorro()
print("Nome: \(cachorro.nome), Idade: \(cachorro.idade)")
3. Inicializadores de Conveniência
Você também pode criar inicializadores de conveniência para fornecer maneiras adicionais de criar instâncias. Eles podem chamar um inicializador designado:
class Retangulo {
var largura: Double
var altura: Double
// Inicializador designado
init(largura: Double, altura: Double) {
self.largura = largura
self.altura = altura
}
// Inicializador de conveniência
convenience init(ladoQuadrado: Double) {
self.init(largura: ladoQuadrado, altura: ladoQuadrado)
}
}
let quadrado = Retangulo(ladoQuadrado: 5.0)
print("Largura: \(quadrado.largura), Altura: \(quadrado.altura)")
4. Inicializadores Failsafe
Você pode criar inicializadores que podem falhar retornando nil
. Isso é particularmente útil quando os valores iniciais devem atender a certas condições.
class Conta {
var saldo: Double
// Inicializador failsafe
init?(saldo: Double) {
if saldo < 0 {
return nil // Inicializador falha
}
self.saldo = saldo
}
}
if let contaValida = Conta(saldo: 100.0) {
print("Conta criada com saldo: \(contaValida.saldo)")
} else {
print("Falha ao criar conta devido a saldo negativo.")
}
Desinicialização
A desinicialização é realizada quando uma instância de uma classe é desalocada. Você pode definir um desinicializador em uma classe usando a palavra-chave deinit
.
1. Desinicializador Básico
Aqui está um exemplo de uma classe com um desinicializador:
class Recurso {
init() {
print("Recurso inicializado.")
}
deinit {
print("Recurso desinicializado.")
}
}
// Criando e liberando uma instância de Recurso
do {
let recurso = Recurso()
} // Recurso é desinicializado aqui
2. Usando Desinicializadores com Closures
Quando você está usando closures que capturam instâncias de uma classe, pode ser necessário gerenciar a limpeza no desinicializador. Aqui está um exemplo:
class GerenciadorDeRede {
var concluido: (() -> Void)?
init() {
concluido = {
print("Operação de rede concluída.")
}
}
deinit {
concluido = nil
print("GerenciadorDeRede desalocado.")
}
}
do {
let gerenciador = GerenciadorDeRede()
} // GerenciadorDeRede é desinicializado aqui
Conclusão
Nesta aula, exploramos os conceitos de inicialização e desinicialização em Swift. Vimos como criar inicializadores básicos, de conveniência e failsafe, assim como implementar desinicializadores para realizar a limpeza quando uma instância é desalocada. Dominar esses conceitos é essencial para gerenciar o ciclo de vida de instâncias e a gestão de recursos em suas aplicações Swift.