Установите значение по умолчанию для свойства с определенным геттером и установщиком

У меня очень простой класс

class SimpleClass {
    var simpleDescription: String {
    get {
        return self.simpleDescription
    }
    set {
        self.simpleDescription = newValue
    }
    }
}

Каков правильный способ определения значения по умолчанию для переменной simpleDescription?

Ответ 1

В Swift используются геттеры и сеттеры для вычисленных свойств - для этого нет хранилища, и, таким образом, в вашем случае simpleDescription не может быть установлен в сеттер.

Если вам нужно значение по умолчанию, используйте:

class SimpleClass {
  var simpleDescription: String = "default description"
}

если вы хотите инициализировать использование:

class SimpleClass {
  var simpleDescription: String
  init (desc: String) {
    simpleDescription = desc
  }
}

Ответ 2

Если вы хотите выполнить действие каждый раз, когда установлена ​​переменная, или просто проверить правильность значения, вы можете использовать Property Observers
 Из документов:

Наблюдатели свойств наблюдают и реагируют на изменения значения свойства. Наблюдатели свойств вызывается каждый раз, когда значение свойства задано, даже если новое значение совпадает с текущим значением свойства.

Вы можете использовать их следующим образом:

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}

EDIT

Похоже, что это не работает при переопределении унаследованных свойств. Вот пример того, что вы не можете:

class StepWihtoutCounter {
    var totalSteps: Int = 0 
}

class StepCounter: StepWihtoutCounter {
    override var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }

Ответ 3

Установка простого значения напрямую:

var string1: String = "value" {
    willSet {
        print("willSet")
    }
    didSet {
        print("didSet")
    }
}

Установка результата вычисляемого замыкания:

var string2: String = {
        let value = "value"
        return value
    }() {
    willSet {
        print("willSet")
    }
    didSet {
        print("didSet")
    }
}

Ответ 4

Решение простое. Просто используйте другую переменную, верните ее в геттер.

var _simpleDescription = "Default value"

var simpleDescription: String {
    get {
        return self._simpleDescription
    }
    set {
        self.simpleDescription = newValue
    }
}