Выбор ответа Senior Swift Concurrency обновлено

Изоляция SwiftUI View

Вопрос

Почему с SDK iOS 18 (Xcode 16) метод view, вызванный из body, можно спокойно пометить как обращающийся к @MainActor-модели без await?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Протокол View теперь @MainActor, и весь тип view изолирован на нём. В SDK iOS 18 протокол View помечен @MainActor, и соответствующие ему типы наследуют эту изоляцию.

Варианты ответа

  1. SwiftUI отключает проверки конкурентности для всех типов, соответствующих View
  2. body всегда вызывается в фоне, а результат переносится на главный поток
  3. Модели SwiftUI не могут быть @MainActor, поэтому await не требуется
  4. Протокол View теперь @MainActor, и весь тип view изолирован на нёмправильный ответ

Разбор

В SDK iOS 18 протокол View помечен @MainActor, и соответствующие ему типы наследуют эту изоляцию. Раньше на главном акторе был только body, а вспомогательные методы и инициализаторы view оказывались неизолированными, что давало предупреждения при обращении к @MainActor-моделям. Проверки конкурентности SwiftUI не отключает, body вызывается на главном потоке, а модели как раз обычно @MainActor.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.