Sobes.tech
Junior

Какво означава, ако за променлива е зададен сетър?

sobes.tech AI

Отговор от AI

Setter (setter) е метод, който позволява да се контролира записването на нова стойност в променлива. При дефиниране на setter, стандартният механизъм за присвояване на стойност по подразбиране се заменя с код вътре в setter-а. Това дава възможност:

  • Валидиране на входните данни: Проверка дали новата стойност отговаря на зададените условия, преди да бъде присвоена на променливата.
    var age: Int = 0 {
        didSet { // DidSet (след промяна) се извиква след присвояване
            if age < 0 {
                age = 0 // Не позволява да се присвои отрицателна стойност
            }
        }
    }
    
  • Изпълнение на допълнителни действия: Стартиране на друг код при промяна на стойността на променливата, например, актуализиране на потребителския интерфейс или уведомяване на други части на приложението.
    var score: Int = 0 {
        didSet { // DidSet (след промяна)
            print("Обновен резултат: \(score)") // Регистриране на промяната
            updateUI() // Обновяване на UI
        }
    }
    
    func updateUI() {
        // Код за обновяване на интерфейса
    }
    
  • Изчисляване на стойностите на други свойства: Промяната на едно свойство може да влияе на стойността на друго.
    var radius: Double = 0.0 {
        didSet { // DidSet
            area = Double.pi * radius * radius // Пресмятане на площта при промяна на радиуса
        }
    }
    
    var area: Double = 0.0 // Свойство, зависимо от radius
    

Setter-ите в Swift могат да се използват за съхранявани (stored) и изчисляеми (computed) свойства. За съхраняваните свойства често се използват наблюдатели на свойства (willSet и didSet), които се извикват преди и след присвояването на нова стойност. За изчисляемите свойства, setter (set) определя как трябва да бъде присвоена стойността.

var myProperty: String {
    // Getter
    get {
        return "Стойността е: \(internalValue)"
    }
    // Setter
    set(newValue) {
        internalValue = newValue + " обработена" // Модифициране на присвоената стойност
    }
}

private var internalValue: String = "" // Вътрешно съхранявано свойство