Что будет напечатано в консоли?

Вывод: 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. Семантика копирования значений сохраняется независимо от внутренних оптимизаций хранения массива.

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

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

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

Подробнее