Вывод: Alice, Bob, Charlie, затем John2, Bob, Charlie. Изменение отдельной переменной first не затрагивает уже созданные элементы массива.
Что будет напечатано в консоли?
Вывод: Alice, Bob, Charlie, затем John2, Bob, Charlie. Изменение отдельной переменной first не затрагивает уже созданные элементы массива.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В задаче рассматривается простая структура Person в Swift, содержащая одно свойство — имя. Создаётся три экземпляра структуры, после чего они помещаются в массив people. Далее имя первого объекта изменяется, а затем массив выводится в консоль. После этого меняется имя первого элемента массива, и массив снова выводится. Нужно понять, как изменятся значения в массиве после изменения переменных, учитывая, что структуры в Swift передаются по значению.
import Foundation
struct Person {
var name: String
init(name: String) {
self.name = name
}
}
func main() {
var first = Person(name: "Alice")
let second = Person(name: "Bob")
let third = Person(name: "Charlie")
var people = [first, second, third] as [Person]
first.name = "John"
for p in people {
print(p.name)
}
people[0].name = "John2"
for p in people {
print(p.name)
}
}
main()
Ответ
Вывод: Alice, Bob, Charlie, затем John2, Bob, Charlie. Изменение отдельной переменной first не затрагивает уже созданные элементы массива.
Массив содержит значения структур, а не ссылки на переменные first, second и third. Поэтому first.name = "John" меняет только first. Запись people[0].name = "John2" изменяет первый элемент самого массива. После обоих циклов у first имя John, у people[0] — John2. Семантика копирования значений сохраняется независимо от внутренних оптимизаций хранения массива.