К какому типу данных (value/reference) относятся замыкания в Swift?

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

Ответ

Замыкания в Swift являются reference type (ссылочным типом).

Что это значит: При присваивании замыкания новой переменной или передаче в функцию копируется ссылка на одно и то же замыкание в памяти, а не его содержимое.

Пример:

let originalClosure = { print("Original") }
let referenceToClosure = originalClosure // Копируется ссылка
// Обе переменные ссылаются на один объект замыкания

Ключевые следствия:

  1. Захват переменных (Capture Lists): Замыкания могут захватывать и хранить ссылки на переменные из окружающего контекста. Это требует управления памятью.
    var counter = 0
    let incrementer = { counter += 1 } // Захватывает `counter`
    incrementer()
    print(counter) // 1
  2. Циклы сильных ссылок (Retain Cycles): Если замыкание, принадлежащее объекту (например, классу), захватывает этот объект (self) сильной ссылкой, возникает цикл. Для его разрыва используют [weak self] или [unowned self].
    class MyClass {
       var closure: (() -> Void)?
       func setup() {
           // ПРАВИЛЬНО: Используем weak
           closure = { [weak self] in
               self?.doSomething()
           }
       }
    }