Нужны два изменения: mutating у метода структуры и var для экземпляра s. У класса метод допустим даже при let-ссылке c.
Обнаружьте баги в Swift‑примерe
Нужны два изменения: mutating у метода структуры и var для экземпляра s. У класса метод допустим даже при let-ссылке c.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В этом примере рассматривается, как изменяется значение свойства в классе и в структуре. Класс SomeClass объявлен с переменной value и методом changeValueInc(), который увеличивает значение. Структура SomeStruct имеет аналогичную переменную и метод, однако в Swift метод структуры не может изменять свойства без указания mutating. Ниже приведён исходный код, в котором попытка изменить value в структуре приводит к ошибке компиляции.
class SomeClass {
var value = 5
func changeValueInc(){
self.value += 1
}
}
struct SomeStruct {
var value = 5
func changeValueInc(){
self.value += 1
}
}
let c = SomeClass()
c.changeValueInc()
let s = SomeStruct()
s.changeValueInc()
Ваше задание – определить, почему код не компилируется и предложить исправление.
Ответ
Нужны два изменения: mutating у метода структуры и var для экземпляра s. У класса метод допустим даже при let-ссылке c.
Исправленная часть:
struct SomeStruct {
var value = 5
mutating func changeValueInc() { value += 1 }
}
var s = SomeStruct()
s.changeValueInc()
После вызова s.value равно 6. SomeClass менять не требуется: c — постоянная ссылка, но свойства объекта остаются изменяемыми согласно их объявлениям. У структуры изменение поля является изменением самого значения, поэтому let s запрещал бы вызов даже после добавления mutating.