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

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

Компании: Masterdata

Стек: iOS, Swift

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

Capture list в closure (замыкании) в Swift - это механизм, который определяет, как замыкание захватывает и хранит ссылки на переменные и константы из окружающего контекста. Он указывается в квадратных скобках [ ] перед списком параметров замыкания.

Основные правила работы:

  • По умолчанию замыкание захватывает переменные как strong reference (сильная ссылка), что может привести к retain cycle (циклу сильных ссылок), особенно при захвате self внутри класса.
  • Capture list позволяет изменить способ захвата: [weak self] создает слабую ссылку (optional), [unowned self] - бесхозную (non-optional, но может вызвать crash при обращении к освобожденному объекту).
  • Можно захватывать несколько переменных: [weak self, weak delegate].
  • Для value-типов (struct, enum) capture list не нужен, так как они копируются, но можно явно указать [weak] для ссылочных типов внутри них.

Пример использования:

SWIFT
class ViewController {
var closure: (() -> Void)?
func setupClosure() {
// Без capture list - retain cycle
closure = { [weak self] in
guard let self = self else { return }
print(self.view.frame)
}
}
}

В этом примере [weak self] предотвращает цикл, так как замыкание не удерживает self сильно. Всегда используйте weak для self в замыканиях, которые могут жить дольше, чем объект, или при асинхронных операциях.

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

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