swift 如何解决将视图函数分配给StateObject属性的问题

z0qdvdin  于 2023-01-12  发布在  Swift
关注(0)|答案(1)|浏览(153)

我在给正则函数赋值

var body: some View {
        contentView
        .task {
                navigation.tabBarVisibility = .hidden
                viewModel.fetchWordset()
                synthesizer.onNextUtteranceEnded = onNextUtteranceEnded
            }
}

private func onNextUtteranceEnded(_ utterance: AVSpeechUtterance) {
        guard utterance.voice?.language == "pl-PL" else { return }
        viewModel.next()
}

在swiftui视图中定义
至x1月1x
它拥有财产

public final class SpeechSynthesizer: NSObject, ObservableObject, AVSpeechSynthesizerDelegate {

    @Published public var isSpeaking = false

    public var onNextUtteranceStarted: ((AVSpeechUtterance) -> Void)?
    public var onNextUtteranceEnded: ((AVSpeechUtterance) -> Void)?

但我收到警告
将类型为“@MainActor(AVSpeechUtterance)-〉()”的函数值转换为“(AVSpeechUtterance)-〉Void”会丢失全局参与者“MainActor”
我能做些什么呢?

lc8prwob

lc8prwob1#

正如您所指出的,View@MainActor绑定在一起,这意味着在您看来,onNextUtteranceEnded的实现也与主要参与者绑定在一起。
SpeechSynthesizer的属性不包含任何这样的限制,因此编译器告诉您,如果您碰巧通过合成器从任何其他参与者调用onNextUtteranceEnded,它将无法帮助您解决问题,您可能会陷入混乱。
答案就在警告中:
正在转换“@MainActor(AVSpeechUtterance)-〉()”类型的函数值
这是视图函数的类型
到“(AVSpeechUtterance)-〉()”时,将丢失全局参与者“MainActor”
这是SpeechSynthesizer.onNextUtteranceEnded的类型
您可以通过更改定义来删除警告:

public var onNextUtteranceEnded: (@MainActor (AVSpeechUtterance) -> ())?

然而,正如其他人所指出的,这确实感觉像是一种奇怪的做事方式。你有一个状态对象,它应该在内部做出逻辑决策并更新发布的属性。视图应该只是响应这些更改。

相关问题