SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
25.11.2024

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

  1. Gerenciamento de Memória: Sempre remova os observadores no deinit para evitar falhas devido a ponteiros dangling.
  2. Propriedades Dinâmicas: Use @objc dynamic para propriedades que você deseja observar para garantir que funcionem corretamente com KVO.
  3. 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!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!