> В чем разница между захватом переменной в closure и копированием (iOS, Swift)

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

Компании: Wildberries

Стек: iOS, Swift

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

Основное различие между захватом переменной в замыкание (closure) и копированием - в способе управления памятью и поведении при изменении значения.

Захват переменной (capture by reference) - замыкание сохраняет ссылку на исходную переменную. В Swift это происходит по умолчанию для ссылочных типов (классы) и для переменных, объявленных с var внутри замыкания. Если исходная переменная изменяется, замыкание "видит" новое значение. Пример:

SWIFT
var x = 10
let closure = { print(x) }
x = 20
closure() // Выведет 20

Копирование (capture by value) - замыкание создаёт и сохраняет собственную копию значения на момент захвата. Для этого используется список захвата с квадратными скобками: [x]. Изменения исходной переменной после захвата не влияют на замыкание. Пример:

SWIFT
var x = 10
let closure = { [x] in print(x) }
x = 20
closure() // Выведет 10

Ключевые моменты для iOS-разработчика:

  • Для value-типов (структуры, перечисления) по умолчанию происходит копирование при захвате, если не указать [x] - но на самом деле Swift захватывает их по значению, а не по ссылке, так что изменение исходной переменной не влияет на замыкание.
  • Для reference-типов (классы) захват по умолчанию - по ссылке, что может привести к сильным ссылочным циклам (retain cycles). Чтобы избежать этого, используют [weak self] или [unowned self].
  • Выбор между захватом и копированием влияет на производительность: копирование больших структур может быть дорогим, а захват ссылок - дешёвым, но требует осторожности с управлением памятью.

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

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