Capture list в Swift — это механизм, позволяющий явно указать, как замыкание захватывает одну или несколько переменных из окружающей области видимости. Он используется для разрешения проблем с retain cycles, особенно при захвате self.
Существует три типа захвата: weak, unowned и unowned(unsafe).
weak: Захватывает переменную как опционал (Optional). Если объект, на который ссылается переменная, будет освобожден, переменная внутри замыкания станет nil. Используется для предотвращения retain cycles, когда одна ссылка может быть nil в течение жизненного цикла.
swift
unowned: Захватывает переменную как неопознанную ссылку. Предполагается, что объект, на который ссылается переменная, имеет тот же или более длительный жизненный цикл, чем замыкание. Если объект освобождается до выполнения замыкания, попытка доступа к нему вызовет ошибку времени выполнения. Используется, когда одна ссылка гарантированно не nil в течение жизненного цикла.
swift
unowned(unsafe): Подобно unowned, но не выполняет проверки времени выполнения. Использование не рекомендуется, если нет специфической необходимости в оптимизации и полной уверенности в жизненном цикле объекта.
Синтаксис capture list: [capture list]. Список помещается сразу после открывающей фигурной скобки замыкания.
swift
Выбор между weak и unowned зависит от гарантированного жизненного цикла объектов. Если замыкание и захватываемый объект могут иметь разный жизненный цикл и объект может стать nil, используется weak. Если замыкаемый объект гарантированно существует, пока выполняется замыкание, используется unowned.