Можно ли создать weak-ссылку на структуру в Swift?

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

Ответ

Нет. Ключевые слова weak и unowned применимы только к ссылочным типам (классам), так как они требуют участия механизма подсчёта ссылок (ARC). Структуры и перечисления — это типы значений, для них концепция сильных/слабых ссылок не имеет смысла.

Пример ошибки:

struct MyStruct {}
weak var weakStructRef: MyStruct? // Ошибка компиляции:
// 'weak' cannot be applied to non-class type 'MyStruct'

Почему? Типы значений копируются при присваивании или передаче в функцию. У них нет единого экземпляра в памяти, на который можно было бы держать слабую ссылку.

Обходной путь: Если необходимо weak-поведение для данных, оберните структуру в класс:

class Box<T> {
    var value: T
    init(_ value: T) { self.value = value }
}

weak var weakBox: Box<MyStruct>? // Теперь это допустимо