Lição: 133: Codificação e Observação de Chave-Valor
A Codificação de Chave-Valor (KVC) e a Observação de Chave-Valor (KVO) são recursos poderosos fornecidos pelo framework Cocoa em Swift. Elas permitem acessar e observar propriedades de objetos dinamicamente em tempo de execução, o que pode resultar em um código mais limpo e uma melhor separação de responsabilidades em suas aplicações. Nesta aula, exploraremos o que são KVC e KVO, como implementá-los e casos de uso comuns.
Codificação de Chave-Valor (KVC)
KVC é um mecanismo que permite acessar as propriedades de um objeto usando identificadores de string. Isso pode ser particularmente útil quando você deseja acessar propriedades dinamicamente, sem precisar referenciá-las diretamente no código.
Exemplo de Codificação de Chave-Valor
Vamos começar com um exemplo simples. Criaremos uma classe representando uma Pessoa e, em seguida, acessaremos suas propriedades usando KVC.
import Foundation
class Pessoa: NSObject {
@objc dynamic var nome: String
@objc dynamic var idade: Int
init(nome: String, idade: Int) {
self.nome = nome
self.idade = idade
}
}
let joao = Pessoa(nome: "João Silva", idade: 30)
// Acessando propriedades usando KVC
let nome = joao.value(forKey: "nome")
let idade = joao.value(forKey: "idade")
print("Nome: \(nome ?? ""), Idade: \(idade ?? 0)")
Neste exemplo, usamos value(forKey:)
para ler as propriedades da instância joao
da classe Pessoa
. Observe que marcamos as propriedades como @objc dynamic
para torná-las compatíveis com KVC.
Observação de Chave-Valor (KVO)
KVO permite observar mudanças nas propriedades de objetos. Isso pode ser extremamente útil para atualizar a interface do usuário ou disparar outras ações em resposta a alterações.
Exemplo de Observação de Chave-Valor
Continuando com a classe Pessoa
, vamos observar mudanças na propriedade idade
.
class ViewModel: NSObject {
@objc dynamic var pessoa: Pessoa
init(pessoa: Pessoa) {
self.pessoa = pessoa
super.init()
self.pessoa.addObserver(self, forKeyPath: "idade", options: [.new, .old], context: nil)
}
deinit {
pessoa.removeObserver(self, forKeyPath: "idade")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "idade" {
if let novaIdade = change?[.newKey] as? Int {
print("Idade alterada para \(novaIdade)")
}
}
}
}
let viewModel = ViewModel(pessoa: joao)
// Simulando uma alteração na idade
joao.setValue(31, forKey: "idade") // Isso irá acionar o observador
Neste exemplo, definimos um ViewModel
que mantém uma referência a uma instância de Pessoa
. Observamos mudanças na propriedade idade
e imprimimos a nova idade sempre que ela muda.
Pontos Importantes
- Gerenciamento de Memória: Sempre remova os observadores no
deinit
para evitar falhas devido a ponteiros dangling. - Propriedades Dinâmicas: Use
@objc dynamic
para propriedades que você deseja observar para garantir que funcionem corretamente com KVO. - Opções: Especifique as opções como
.new
e.old
para obter os valores anteriores e novos quando a propriedade mudar.
Casos de Uso
- Vinculação de Elementos da Interface do Usuário: KVO é frequentemente usado em cenários onde os elementos da interface do usuário precisam refletir mudanças em modelos de dados subjacentes.
- Processamento de Dados: Monitore mudanças em modelos de dados que podem desencadear processamento adicional ou cálculos.
Conclusão
Nesta aula, abordamos os conceitos básicos de Codificação e Observação de Chave-Valor em Swift. Esses conceitos podem simplificar significativamente seu código e aprimorar a funcionalidade ao permitir o acesso dinâmico e a observação de propriedades. Não deixe de aproveitar esses recursos poderosos ao construir suas aplicações!