Ответ
Модификатор weak можно применять только к ссылочным типам (классам). Это связано с тем, что weak участвует в механизме подсчёта ссылок (ARC), который управляет временем жизни экземпляров классов.
Почему только классы?
- Классы (Reference types) хранятся в куче, и их время жизни управляется ARC.
weakсоздаёт некрепкую ссылку, которая не увеличивает счётчик ссылок и автоматически обнуляется (nil), когда объект уничтожается. - Структуры и перечисления (Value types) не используют ARC и передаются по значению, поэтому для них концепция
weakссылки не имеет смысла.
Основное применение: Предотвращение сильных циклов удержания (retain cycles), особенно в паттернах «делегат» и при захвате self в замыканиях.
class ViewController {
// Делегат объявлен как weak, чтобы не создавать цикл удержания
weak var delegate: SomeDelegate?
}
class MyClass {
var closure: (() -> Void)?
func setupClosure() {
// Захват self как weak ссылки внутри замыкания
closure = { [weak self] in
guard let self = self else { return }
self.doSomething()
}
}
}
Важное правило: Поскольку weak ссылка может стать nil, она всегда должна быть объявлена как опциональная переменная (var).