У меня есть главный координатор, который может подать заявку.
protocol Coordinator: AnyObject {
func start()
}
class MMMainCoordinator: Coordinator {
let navigationController: UINavigationController
let letterStore = MockData.letterStore
var rootVC: UIViewController!
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func start() {
let viewModel = MMHomeViewModel(letterStore: letterStore)
viewModel.mainCoordinator = self
let rootVC = MMHomeViewController(viewModel: viewModel)
self.rootVC = rootVC
navigationController.pushViewController(rootVC, animated: false)
}
}
После добавления @MainActor в этот класс я получаю предупреждение для функции start().
Метод экземпляра основного изолированного субъекта start() не может использоваться для удовлетворения требований неизолированного протокола.
Xcode также показывает исправление.
Добавьте «nonisolated» в «start()», чтобы этот метод экземпляра не был изолирован от актера.
О чем это предупреждение?
@Sweeper Это правильный ход.
Проблема в том, что ваш протокол определяет требование (функция start
), которое не ограничено каким-либо конкретным контекстом (это noniosolated
), но затем вы пытаетесь удовлетворить это требование с помощью изолированной функции (а именно функции start
, которая является методом из MMMainCoordinator
).
Компилятор предлагает везде пометить функцию как nonisolated
, чтобы было ясно, что она не привязана к определенному контексту.
Вы можете либо сделать это, либо указать, что требования самого протокола могут быть удовлетворены только кодом, изолированным от основного актера:
@MainActor
protocol Coordinator: AnyObject {
func start()
}
@MainActor
class MMMainCoordinator: Coordinator {
func start() {
}
}
Как насчет того, чтобы отметить
Coordinator
протокол@MainActor
?