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

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

Ответ

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

Почему возникает ошибка:

weak var weakArray: [Int]? // Ошибка компиляции:
// 'weak' cannot be applied to non-class type '[Int]'

Решение: Если нужно обеспечить weak-семантику для коллекции данных, необходимо обернуть массив в класс.

Пример с классом-оберткой:

// 1. Создаем класс-контейнер
class WeakArrayContainer<T> {
    var elements: [T]
    init(_ elements: [T]) {
        self.elements = elements
    }
}

// 2. Теперь можно создать weak-ссылку на контейнер
weak var weakContainer: WeakArrayContainer<Int>?

// 3. Использование
let container = WeakArrayContainer([1, 2, 3])
weakContainer = container
// Когда `container` будет деинициализирован, `weakContainer` автоматически станет nil

Альтернатива для weak ссылок на элементы массива: Используйте [WeakRef<T>], где WeakRef — это класс-обертка для weak хранения любого объекта.