> Что такое closure и capture list в Swift и как они работают (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Wildberries, Masterdata

Стек: iOS, Swift

> Пример ответа

Замыкание (closure) в Swift - это самодостаточный блок кода, который может захватывать и хранить ссылки на переменные и константы из окружающего контекста. Это аналог блоков в Objective-C или лямбд в других языках.

Как работает захват (capture):
Когда замыкание использует переменную из внешней области видимости, Swift автоматически создает копию этой переменной (для value-типов) или увеличивает счетчик ссылок (для reference-типов). Замыкание "запоминает" эти значения на момент своего создания, даже если исходный контекст уже уничтожен.

Capture list - это синтаксическая конструкция, которая позволяет явно управлять захватом. Она записывается в квадратных скобках перед параметрами замыкания:

SWIFT
var counter = 0
let closure = { [counter] in
print(counter)
}
counter = 10
closure() // Выведет 0, а не 10

Зачем нужен capture list:

  1. Предотвращение retain cycles - использование [weak self] или [unowned self] в замыканиях, принадлежащих объекту, чтобы избежать циклических ссылок.

  2. Явное копирование - захват значения по значению, а не по ссылке (как в примере выше).

  3. Изменение семантики - например, [weak self] делает захваченную ссылку опциональной.

Пример с weak self:

SWIFT
class ViewController {
var data: String = "Hello"
func setupHandler() {
// [weak self] предотвращает retain cycle
let handler = { [weak self] in
guard let self = self else { return }
print(self.data)
}
someAsyncOperation(completion: handler)
}
}

Без capture list замыкание захватило бы self сильно, и если someAsyncOperation хранит замыкание дольше, чем живет ViewController, возникнет утечка памяти.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью