Выбор ответа Junior Типы значений и ссылочные спрашивают часто обновлено
let и экземпляр класса: можно ли менять свойства
Вопрос
Какая строка не скомпилируется?
final class C { var title = "A" }
struct S { var title = "A" }
let c = C()
let s = S()
c.title = "B"
s.title = "B"
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: s.title = "B". let для класса фиксирует ссылку: переменную c нельзя перенаправить на другой объект, но var-свойства самого объекта менять можно, поэтому c.title = "B" компилируется.
Варианты ответа
s.title = "B"правильный ответc.title = "B"- Обе строки скомпилируются
- Обе строки не скомпилируются
Разбор
let для класса фиксирует ссылку: переменную c нельзя перенаправить на другой объект, но var-свойства самого объекта менять можно, поэтому c.title = "B" компилируется. Для структуры let делает неизменяемым всё значение целиком, включая var-свойства, поэтому s.title = "B" это ошибка компиляции.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Задача на Swift: стек отмены для текстового поля
Следующий вопрос
Типы Swift: значение или ссылка
Ещё по теме «Типы значений и ссылочные»
- Copy-on-write у Array: когда копируется буфер
- Модификаторы borrowing и consuming
- Как сделать свой copy-on-write
- Existential container: как хранится any Protocol
- Типы значений и ссылочные типы в Swift
- Оператор === в Swift
- Зачем indirect у enum
- Когда пропадает memberwise-инициализатор структуры