Начнем с некоторых сегментов кода
struct DigitS {
var number = 42
init(_ n: Int) {
self.number = n
}
mutating func replace() {
self = DigitS(12) // mutating
}
}
class DigitC {
var number = 42
init(_ n: Int) {
self.number = n
}
func replace() {
self = DigitC(12) //#Cannot assign to value: "self" is immutable
}
}
В течение очень долгого времени я был очень смущен значением изменчивого, модифицируемого. Вот некоторые из моих пониманий на данный момент, было бы неплохо, если бы вы могли указать на все ошибки, которые могут быть
Мутирующая функция в приведенном выше типе структуры не «мутирует» экземпляр, она заменяет старое значение переменной совершенно новым.
Мутирование означает: действие, такое как присваивание, инициализация или функция мутирования, не изменяет текущее значение, а вызывает замену.
Значение переменной класса неизменяемо, но вы можете модифицировать/изменить текущее значение (это причина, по которой компилятор выдает предупреждение, смотрите комментарии со знаком #)
Наблюдатель сеттера может быть вызван только в том случае, если тип является типом значения, потому что сеттер сообщает, была ли переменная изменена/заменена (см. Код ниже)
struct Digit { var number = 12 } var b = Digit() { didSet{ print("number is set") } } b.number = 22 // observer is called class Digit { var number = 12 } var b = Digit() { didSet{ print("number is set") } } b.number = 22 // observer is not called
Спасибо за ваше время и помощь