Ответ
Нет, не может.
Причина: Слабая ссылка (weak) должна быть изменяемой (var), потому что ARC автоматически устанавливает ее в nil, когда объект, на который она ссылается, освобождается. Константа (let) не может быть изменена после инициализации, что противоречит этой семантике.
Пример, вызывающий ошибку компиляции:
class MyClass {}
// Ошибка: 'weak' must be a mutable variable
weak let constantReference: MyClass? = MyClass()
Правильное объявление:
class MyClass {}
// Слабая ссылка всегда должна быть 'var'
weak var weakReference: MyClass? = MyClass()
// После освобождения объекта weakReference автоматически станет nil
// Это изменение возможно только потому, что она объявлена как 'var'
Ключевой вывод: Модификаторы weak и unowned применимы только к переменным (var).
Ответ 18+ 🔞
А, слушай, тут один тонкий момент, который вгоняет в ступор даже бывалых, когда впервые сталкиваются. Представь себе такую картину.
Вот ты объявляешь слабую ссылку, weak. Её главная фишка в чём? В том, что когда объект, на который она указывает, отправляется на свалку истории (то есть в нирвану деаллокации), ARC — эта наша сволочь-сборщик мусора — берёт и автоматом выставляет эту ссылку в nil. Чтоб не болталась, понимаешь, как хуй в проруби, указывая в пустоту.
А теперь вдумайся. Если ты объявишь её как let, как константу, что ты заявляешь? "Эй, система, это значение — раз и навсегда! Не смей его трогать!" А ARC смотрит на это, чешет репу и говорит: "Ну, блядь, извини, дружок, но моя работа — занулять эту ссылку, когда объект сдохнет. А ты мне не даёшь её менять. Так не пойдёт".
Вот и выходит конфликт интересов, ёпта. Семантика weak требует возможности изменения, а let эту возможность нахуй запирает. Компилятор, видя эту дичь, просто плюётся и отказывается компилировать такой бред.
Смотри, как НЕ НАДО делать, иначе получишь ошибку прямо в ебало:
class MyClass {}
// Ошибка: 'weak' must be a mutable variable
weak let constantReference: MyClass? = MyClass() // Вот эта хуйня не скомпилится!
А вот как надо — правильно и по-человечески:
class MyClass {}
// Слабая ссылка — только 'var'. Точка.
weak var weakReference: MyClass? = MyClass()
// Дальше жизнь идёт, объект может исчезнуть...
// И тогда weakReference тихо и мирно станет nil, без всяких утечек памяти.
// И это изменение возможно только потому, что она 'var'.
Короче, вывод, который надо выжечь на подкорке: Модификаторы weak и его брат-самоубийца unowned работают ТОЛЬКО с переменными (var). С константами (let) — ни в какую, нихуя не выйдет. Запомни это, и будет тебе счастье, а не ошибки компиляции.