В Swift, когда тип-значение (value type) может вести себя как ссылочный тип (reference type)?

«В Swift, когда тип-значение (value type) может вести себя как ссылочный тип (reference type)?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Тип-значение в Swift может демонстрировать поведение, схожее со ссылочным типом, в следующих случаях:

  1. При использовании inout параметров: Функция получает неявную ссылку на исходную переменную, позволяя её модифицировать.

    func increment(_ value: inout Int) {
        value += 1
    }
    var number = 10
    increment(&number) // number теперь равно 11
  2. При захвате в замыкании без списка захвата: Если значение изменяется внутри замыкания, оно захватывается по ссылке, а не по копии.

    var counter = 0
    let closure = {
        counter += 1 // Захватывает 'counter' по ссылке, изменяя оригинал
    }
    closure()
    print(counter) // 1
  3. При помещении в ссылочный тип: Когда структура или перечисление становится свойством класса, оно хранится в куче вместе с экземпляром этого класса.

    class Container {
        var value: Int = 0 // Тип-значение Int размещается в куче как часть экземпляра Container.
    }
  4. При использовании @escaping замыканий: Изменяемые типы-значения, захваченные таким замыканием, требуют особого внимания, так как их время жизни может быть продлено.

Ключевое отличие: Даже в этих случаях семантика копирования (copy-on-write для структур) сохраняется. Поведение лишь напоминает ссылочное из-за работы с общим, а не уникальным, хранилищем данных.