无法从另一个类初始化 MainActor 隔离类

问题描述 投票:0回答:1

我有一小段代码由于

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
    }
}

enter image description here

swift isolation mainactor
1个回答
0
投票

这是一个已知限制,已在 Swift 5.10 中作为 SE-0411 的一部分修复。

您需要通过将

IsolatedDefaultValues
传递到
-enable-upcoming-feature IsolatedDefaultValues
构建设置来启用
OTHER_SWIFT_FLAGS
即将推出的功能。有关更多信息,请参阅使用即将推出的功能标志

在 Swift 5.10 之前,默认输入参数始终为

nonisolated
,这意味着您无法使用 actor 隔离类型作为默认输入参数。 SE-0411 通过确保如果一个方法是 actor 隔离的,那么它的默认输入参数也会从该 actor 调用,从而解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.