В каком случае в Swift можно использовать `weak let`?

«В каком случае в Swift можно использовать `weak let`?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Конструкция weak let используется для объявления слабой ссылки (weak) на неизменяемое значение (let). Это возможно, когда:

  1. Ссылаемый объект (экземпляр класса) может быть освобожден в течение жизненного цикла захватывающего контекста.
  2. Сама ссылка после захвата не должна меняться (является константой).

Практический пример — захват в замыкании:

class Service {
    func fetchData() { print("Fetching...") }
}

let networkService = Service()

let completionHandler = { [weak let service = networkService] in
    // `service` — слабая константа. Она может стать `nil`,
    // но сама ссылка `service` внутри замыкания неизменна.
    service?.fetchData()
}

Ключевой момент: weak ссылка всегда опциональна (Optional), поэтому даже weak let будет иметь тип SomeClass?. Ее значение может измениться на nil при деаллокации объекта, но переназначить саму переменную service на другой объект нельзя.