Как написано, доступ к mainObject.b из внешнего синхронного контекста запрещён. Читать actor-isolated var нужно через await из асинхронного кода.
Скомпилируется ли фрагмент Swift? (вариант 2)
Как написано, доступ к 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.