Выбор ответа Senior Swift Concurrency обновлено
Изоляция SwiftUI View
Вопрос
Почему с SDK iOS 18 (Xcode 16) метод view, вызванный из body, можно спокойно пометить как обращающийся к @MainActor-модели без await?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Протокол View теперь @MainActor, и весь тип view изолирован на нём. В SDK iOS 18 протокол View помечен @MainActor, и соответствующие ему типы наследуют эту изоляцию.
Варианты ответа
- SwiftUI отключает проверки конкурентности для всех типов, соответствующих
View bodyвсегда вызывается в фоне, а результат переносится на главный поток- Модели SwiftUI не могут быть
@MainActor, поэтомуawaitне требуется - Протокол
Viewтеперь@MainActor, и весь тип view изолирован на нёмправильный ответ
Разбор
В SDK iOS 18 протокол View помечен @MainActor, и соответствующие ему типы наследуют эту изоляцию. Раньше на главном акторе был только body, а вспомогательные методы и инициализаторы view оказывались неизолированными, что давало предупреждения при обращении к @MainActor-моделям. Проверки конкурентности SwiftUI не отключает, body вызывается на главном потоке, а модели как раз обычно @MainActor.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.