Будет напечатано Buddy1: dog1 и dog2 содержат ссылки на один экземпляр Dog, а не два независимых объекта.
Что будет выведено в примере №30
Будет напечатано Buddy1: dog1 и dog2 содержат ссылки на один экземпляр Dog, а не два независимых объекта.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В данном упражнении вам необходимо предсказать вывод программы, работающей с опциональными ссылками на объект класса. Проанализируйте, как изменяется состояние объектов и какие значения будут доступны через опциональную цепочку.
import Foundation
class Dog {
var name: String
init(name: String) {
self.name = name
}
}
var dog1: Dog? = Dog(name: "Buddy")
var dog2: Dog? = dog1
dog1?.name = "Buddy1"
print(dog2?.name ?? "nil")
Определите, какое значение будет напечатано в консоль при выполнении данного кода.
Ответ
Будет напечатано Buddy1: dog1 и dog2 содержат ссылки на один экземпляр Dog, а не два независимых объекта.
Присваивание optional-ссылки копирует значение ссылки, сохраняя общий объект класса. Операция dog1?.name = "Buddy1" изменяет свойство этого экземпляра, поэтому чтение через dog2 видит новое имя. Оператор ?? не используется, поскольку dog2 не равен nil. Если затем присвоить dog1 = nil, объект останется жив, пока его сильно удерживает dog2; это отличается от изменения имени.