Что значит слово self в SwiftUI
Что проверяют
Различаете ли вы три разные роли слова self в коде на SwiftUI, и понимаете ли разницу между структурой представления и классом модели: от неё зависит, нужен ли слабый захват.
Как отвечать
Разберите по местам.
Первое: self внутри типа это ссылка на текущий экземпляр. Пишут его, когда надо снять неоднозначность, например в инициализаторе, где имя параметра совпадает с именем свойства. В остальных случаях он необязателен: View это структура, и в актуальных версиях Swift компилятор не требует явного self в замыканиях у типов-значений.
Второе: Self с большой буквы это тип, в котором выполняется код, а запись MyView.self даёт метатип, то есть значение, описывающее сам тип.
Третье, и в SwiftUI самое частое: id: \.self в ForEach и List. Это ключевой путь на сам элемент, то есть просьба использовать значение как идентификатор. Работает только для типов, соответствующих Hashable.
ForEach(names, id: \.self) { name in
Text(name)
}Про захват скажите отдельно. В представлении замыкание захватывает копию структуры, цикла удержания не возникает. А внутри класса, например наблюдаемого объекта модели, где замыкание живёт дольше вызова (подписка, таймер, колбэк сети), слабый захват self уже нужен.
Где спотыкаются
Ставят id: \.self на массив строк или чисел с повторами. Одинаковые значения дают одинаковый идентификатор, и список начинает путать строки при вставке и анимации. Идентификатор обязан быть уникальным и стабильным, лучше отдельное поле.
Второе: по привычке из UIKit пишут [weak self] в замыкании представления. Для структуры это ошибка компиляции, а не лишняя перестраховка.
Третье: думают, что явный self что-то оптимизирует. На поведение он не влияет; в классе он лишь напоминает, что замыкание удерживает объект, и решение про захват надо принять осознанно.