Будет напечатано 000: оба массива содержат ссылки на один и тот же первый объект Awesome.
Какой результат будет выведен? №17
Будет напечатано 000: оба массива содержат ссылки на один и тот же первый объект Awesome.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, что напечатает данный Swift‑код при его выполнении.
class Awesome {
var name: String
init(name: String) {
self.name = name
}
}
let obj1 = Awesome(name: "123")
let obj2 = Awesome(name: "456")
let array1 = [obj1, obj2]
let array2 = array1
array2[0].name = "000"
print(array1[0].name)
Ответ
Будет напечатано 000: оба массива содержат ссылки на один и тот же первый объект Awesome.
Array имеет семантику значения, но его элементы-классы сохраняют ссылочную семантику. Копирование array1 в array2 не создаёт новые экземпляры Awesome. array2[0].name меняет общий объект, который затем читается через array1. Объявление массива через let запрещает изменение самого контейнера, но не mutable-свойств принадлежащих ему ссылочных объектов. Для независимого состояния объектов нужно явное клонирование.