如何为SFSpeechRecognitionTask设置代理?

4
在大多数情况下,设置委托只需要在类中实现委托协议,并将该类的实例声明为您正在使用的实例的委托即可。
我实际上在我的代码中针对同一语音框架中属于SFSpeechRecognizer的对象使用了这个基本概念。(伪代码示例):
class myViewControllerClass: SFSpeechRecognizerDelegate{

let mySpeechRecognizer = SFSpeechRecognizer(...)

viewDidLoad(){
mySpeechRecognizer.delegate = self
}
...

//SFSpeechRecognizerDelegate Functions here
...

}  
//This works as expected, woo!

然而,似乎SFSpeechRecognitionTask没有可设置的委托属性。我尝试在我的类中实现“SFSpeechRecognitionTaskDelegate”协议,希望它会神奇地起作用。但是,委托函数似乎从未被调用过。这有点说得通,因为它不知道我的视图控制器应该是委托,所以它为什么会呢!?苹果文档涵盖了协议本身以及如何使用它:

https://developer.apple.com/reference/speech/sfspeechrecognitiontaskdelegate

但是任务本身的文档没有标识出任何委托属性:

https://developer.apple.com/reference/speech/sfspeechrecognitiontask

此外,以下是SFSpeechRecognizer文档,其中包含协议并且像您预期的那样标识了委托属性:

https://developer.apple.com/reference/speech/sfspeechrecognizer

我是否应该使用其他替代方法来设置SFSpeechRecognitionTask的代理?或者它是以完全不同的方式处理的?

2个回答

7
在SFSpeechRecognizer中,有一个方法:
func recognitionTask(with request: SFSpeechRecognitionRequest, 
        delegate: SFSpeechRecognitionTaskDelegate) -> SFSpeechRecognizerTask

您可以将代理传递给SFSpeechRecognizerTask。


2
啊,这确实解决了委托问题,但是又让我有了另一个问题,可能是个傻问题... 我目前正在使用SpeechRecognizer上的另一个recognitionTask方法:func recognitionTask(with: SFSpeechRecognitionRequest, resultHandler: @escaping (SFSpeechRecognitionResult?, Error?) -> Void)并使用结果处理程序函数来处理语音处理。如果我想同时拥有结果处理程序和定义委托,我该怎么办?难道我必须拥有我的蛋糕,但却被迫盯着它发呆而不能吃它吗?! - Bebhead
1
代理提供了方法 optional func speechRecognitionTask(_ task: SFSpeechRecognitionTask, didFinishRecognition recognitionResult: SFSpeechRecognitionResult),我认为它与处理程序做的事情相同。 - TheAmateurProgrammer
啊哈!非常感谢您,先生。 - Bebhead

2

我在ViewController中是这样做的:

recognitionTask = speechRecognizer?.recognitionTask(with: speechRecognitionRequest, delegate: self)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接