Первый вывод: ["One", "Two", "Three"]. Второй содержит (1, 1), (2, 2), (3, 4): массивы отдельные, но экземпляры MyView общие.
Какой вывод будет получен в примере №6
Первый вывод: ["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)]. Для независимого изменения объектов потребовалось бы их явное клонирование.