我有一小段代码由于
Call to main actor-isolated initializer 'init(username:)' in a synchronous nonisolated context
而无法编译。
我不明白,因为正如您所看到的,这两个类都用
@MainActor
注释,并且我尝试将其添加到 GlobalState
的构造函数中以防万一,也不起作用。
知道这是怎么回事吗?希望得到解释和解决方案。
谢谢!
import SwiftUI
@MainActor
public final class User: ObservableObject {
@Published public var username: String
public init(username: String) {
self.username = username
}
}
@MainActor
public final class GlobalState: ObservableObject {
@Published public var user: User
public init(user: User = .init(username: "safd")) { // error here
self.user = user
}
}
这是一个已知限制,已在 Swift 5.10 中作为 SE-0411 的一部分修复。
您需要通过将
IsolatedDefaultValues
传递到 -enable-upcoming-feature IsolatedDefaultValues
构建设置来启用 OTHER_SWIFT_FLAGS
即将推出的功能。有关更多信息,请参阅使用即将推出的功能标志。
在 Swift 5.10 之前,默认输入参数始终为
nonisolated
,这意味着您无法使用 actor 隔离类型作为默认输入参数。 SE-0411 通过确保如果一个方法是 actor 隔离的,那么它的默认输入参数也会从该 actor 调用,从而解决了这个问题。