Выбор ответа 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" компилируется.

Варианты ответа

  1. s.title = "B"правильный ответ
  2. c.title = "B"
  3. Обе строки скомпилируются
  4. Обе строки не скомпилируются

Разбор

let для класса фиксирует ссылку: переменную c нельзя перенаправить на другой объект, но var-свойства самого объекта менять можно, поэтому c.title = "B" компилируется. Для структуры let делает неизменяемым всё значение целиком, включая var-свойства, поэтому s.title = "B" это ошибка компиляции.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.