Обнаружьте баги в Swift‑примерe

Нужны два изменения: mutating у метода структуры и var для экземпляра s. У класса метод допустим даже при let-ссылке c.

Короткий ответ

Что ответить на собеседовании

Нужны два изменения: 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее