Какой вывод будет получен в примере №6

Первый вывод: ["One", "Two", "Three"]. Второй содержит (1, 1), (2, 2), (3, 4): массивы отдельные, но экземпляры MyView общие.

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

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

Первый вывод: ["One", "Two", "Three"]. Второй содержит (1, 1), (2, 2), (3, 4): массивы отдельные, но экземпляры MyView общие.

Подробный разбор

Ответ с пояснениями

Условие

В этом примере показывается, как работают массивы, содержащие объекты‑ссылки, при их копировании между разными контроллерами. Создаются два наследника базового контроллера, заполняются массивы строк и массивы представлений, после чего один из массивов изменяется во втором контроллере. Затем выводятся массивы первого контроллера, чтобы увидеть, какие изменения отразились на его данных.

class MyView: CustomStringConvertible {
    let idx: UInt
    var identifier: String

    init(withIdx idx: UInt) {
        self.idx = idx
        identifier = String(idx)
    }

    var description: String {
        return "(\(idx), \(identifier))"
    }
}

class MyViewController {
    var words = [String]()
    var elements = [MyView]()
}

class FirstViewController: MyViewController {}
class SecondViewController: MyViewController {}

let firstVC = FirstViewController()
firstVC.words = ["One", "Two", "Three"]
firstVC.elements = [MyView(withIdx: 1), MyView(withIdx: 2), MyView(withIdx: 3)]

let secondVC = SecondViewController()
secondVC.words = firstVC.words
secondVC.elements = firstVC.elements

secondVC.words.popLast()
print(firstVC.words)

secondVC.elements.last?.identifier = "4"
print(firstVC.elements)

Ответ

Первый вывод: ["One", "Two", "Three"]. Второй содержит (1, 1), (2, 2), (3, 4): массивы отдельные, но экземпляры MyView общие.

Удаление последней строки из secondVC.words меняет значение только этого массива. При копировании elements копируется контейнер ссылок, а не сами MyView. Поэтому изменение identifier у последнего объекта через secondVC видно и через firstVC; idx остаётся 3. Благодаря CustomStringConvertible массив объектов обычно отображается как [(1, 1), (2, 2), (3, 4)]. Для независимого изменения объектов потребовалось бы их явное клонирование.

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

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

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

Подробнее