我在给正则函数赋值
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”
我能做些什么呢?
1条答案
按热度按时间lc8prwob1#
正如您所指出的,
View
与@MainActor
绑定在一起,这意味着在您看来,onNextUtteranceEnded
的实现也与主要参与者绑定在一起。SpeechSynthesizer
的属性不包含任何这样的限制,因此编译器告诉您,如果您碰巧通过合成器从任何其他参与者调用onNextUtteranceEnded
,它将无法帮助您解决问题,您可能会陷入混乱。答案就在警告中:
正在转换“@MainActor(AVSpeechUtterance)-〉()”类型的函数值
这是视图函数的类型
到“(AVSpeechUtterance)-〉()”时,将丢失全局参与者“MainActor”
这是
SpeechSynthesizer.onNextUtteranceEnded
的类型您可以通过更改定义来删除警告:
然而,正如其他人所指出的,这确实感觉像是一种奇怪的做事方式。你有一个状态对象,它应该在内部做出逻辑决策并更新发布的属性。视图应该只是响应这些更改。