Sobes.tech
Junior

O que significa se definir um setter para uma variável?

sobes.tech IA

Resposta da IA

Um setter (definidor) é um método que permite controlar a gravação de um novo valor numa variável. Ao definir um setter, o mecanismo padrão de atribuição de valores por defeito é substituído por um código dentro do setter. Isto permite:

  • Validar os dados de entrada: Verificar se o novo valor cumpre as condições estabelecidas antes de o atribuir à variável.
    var age: Int = 0 {
        didSet { // O setter (didSet) é chamado após a atribuição
            if age < 0 {
                age = 0 // Não permitir atribuir um valor negativo
            }
        }
    }
    
  • Executar ações adicionais: Executar outro código ao alterar o valor da variável, por exemplo, atualizar a interface de utilizador ou notificar outras partes da aplicação.
    var score: Int = 0 {
        didSet { // O setter (didSet)
            print("Pontuação atualizada para \(score)") // Registar a alteração
            updateUI() // Atualizar a UI
        }
    }
    
    func updateUI() {
        // Código para atualizar a interface
    }
    
  • Calcular valores de outras propriedades: A alteração de uma propriedade pode influenciar o valor de outra.
    var radius: Double = 0.0 {
        didSet { // O setter (didSet)
            area = Double.pi * radius * radius // Recalcular a área ao alterar o raio
        }
    }
    
    var area: Double = 0.0 // Propriedade dependente de radius
    

Os setters em Swift podem ser usados para propriedades armazenadas e propriedades calculadas. Para propriedades armazenadas, costuma-se usar observadores de propriedades (willSet e didSet), que são chamados antes e depois de definir um novo valor, respetivamente. Para propriedades calculadas, o setter (set) define como deve ser atribuída uma valor.

var myProperty: String {
    // Getter
    get {
        return "O valor é: \(internalValue)"
    }
    // Setter
    set(newValue) {
        internalValue = newValue + " processado" // Modificar o valor atribuído
    }
}

private var internalValue: String = "" // Propriedade interna armazenada