0Pricing
Swift Academy · Урок

Списки захвата замыканий и [weak self]

Используйте списки захвата, чтобы замыкания не удерживали объекты сильными ссылками.

«Списки захвата замыканий и [weak self]» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Добро пожаловать

Замыкания захватывают переменные из окружающей области видимости. Списки захвата (`[weak self]`, `[unowned self]`, `[value]`) точно определяют, как выполняется этот захват.

Захват сильных ссылок по умолчанию

```swift var name = "Alice" let greet = { print("Hello, \(name)") } name = "Bob" greet() // "Hello, Bob" — closure sees current value ``` По умолчанию замыкания захватывают *ссылки* на переменные.

Основы списков захвата

```swift var count = 10 let snapshot = { [count] in print(count) } // captures value count = 99 snapshot() // 10 — snapshot of count at capture time ``` Указание типа-значения в `[]` копирует значение в момент создания замыкания.

Шаблон [weak self]

```swift class API { func fetch(completion: @escaping () -> Void) { ... } } class VC { func load() { api.fetch { [weak self] in guard let self else { return } // self might be nil by now self.updateUI() } } } ```

guard let self с продлением времени жизни

Swift 5.3+: повторно свяжите `self` внутри `guard`, не создавая затенения: ```swift { [weak self] in guard let self else { return } // 'self' is now strong within this block doA() doB() doC() } ```

[unowned self]: когда это безопасно

```swift button.addTarget(self, action: #selector(tap), for: .touchUpInside) // If the button's closure is guaranteed not to outlive self: let action: () -> Void = { [unowned self] in self.handleTap() } ```

Захват нескольких значений

```swift let base = 100 let multiplier = 2 let compute = { [base, multiplier] in base * multiplier } print(compute()) // 200 ``` Захватывайте несколько значений в одном списке, разделяя их запятыми.

Список захвата с именованными привязками

```swift let myService = service // rename in capture list: let handler = { [service = myService] in service.process() } ``` Это удобно, когда нужно захватить конкретный снимок под новым именем.

Экранирующие и неэкранирующие замыкания

• Замыкание с `@escaping` может быть сохранено и вызвано после возврата функции → существует риск циклов • Неэкранирующее замыкание вызывается до возврата функции → риска циклов нет ```swift func apply(_ f: () -> Void) { f() } // non-escaping, no [weak] needed func later(_ f: @escaping () -> Void) { queue.async { f() } } // escaping ```

Отладка проблем с захватом

Если вы подозреваете цикл: 1. Добавьте `deinit { print("deallocated") }` в класс 2. Перейдите на другой экран или установите для экземпляра значение nil 3. Если `deinit` ничего не выводит → существует цикл Затем добавьте `[weak self]` в замыкания этого класса.

Быстрая проверка

Что делает `[weak self]` в списке захвата?

Итоги

Основные выводы: • Замыкания по умолчанию захватывают ссылки • Список захвата `[value]` копирует типы-значения в момент создания • `[weak self]` — не удерживает объект и автоматически становится nil; используйте `guard let self` • `[unowned self]` — не удерживает объект и не защищает от nil • Замыкания с `@escaping` требуют списков захвата; неэкранирующие обычно не требуют Курс завершен! Далее: функциональное программирование в Swift.

Часто задаваемые вопросы

Урок «Списки захвата замыканий и [weak self]» бесплатный?

Да — полный текст урока «Списки захвата замыканий и [weak self]» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Списки захвата замыканий и [weak self]»?

Используйте списки захвата, чтобы замыкания не удерживали объекты сильными ссылками. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Списки захвата замыканий и [weak self]»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Как ARC подсчитывает ссылки
  2. Циклы удержания: причины и обнаружение
  3. Ссылки weak и unowned
  4. Списки захвата замыканий и [weak self]
← Назад к Swift Academy