Скомпилируется ли фрагмент Swift? (вариант 2)

Как написано, доступ к mainObject.b из внешнего синхронного контекста запрещён. Читать actor-isolated var нужно через await из асинхронного кода.

Короткий ответ

Что ответить на собеседовании

Как написано, доступ к mainObject.b из внешнего синхронного контекста запрещён. Читать actor-isolated var нужно через await из асинхронного кода.

Подробный разбор

Ответ с пояснениями

Условие

Определите, компилируется ли следующая программа на Swift без ошибок. Обратите внимание на правила изоляции акторов при доступе к свойствам извне актера.

actor Main {
    let a = 0
    var b = 0
}

let mainObject = Main()

print(mainObject.a)
print(mainObject.b)

Ответ

Как написано, доступ к mainObject.b из внешнего синхронного контекста запрещён. Читать actor-isolated var нужно через await из асинхронного кода.

Свойство a — неизменяемый Int; в том же модуле такое actor-let допускает синхронное чтение. Изменяемое b защищено актором и требует перехода к его изоляции:

func inspect(_ object: Main) async {
    print(object.a)
    print(await object.b)
}

actor Main — обычный пользовательский actor, а не singleton MainActor. Для API между модулями правила доступа к let и публичный nonisolated-контракт нужно учитывать отдельно. Простая замена var на общедоступное небезопасное состояние не является исправлением изоляции.

Источник: github.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее