我按原样转换了 Objective-C 语音识别 API Swift。
class ViewController: UIViewController, SpeechRecognitionProtocol {
var micClient: MicrophoneRecognitionClient
var isMicrophoneReco: Bool
/* Action for pressing the "Start" button */
@IBAction func startButtonTapped(sender: AnyObject) {
if isMicrophoneReco {
var status: OSStatus = micClient.startMicAndRecognition()
}
}
我遇到以下错误:
类型“ViewController”不符合“SpeechRecognitionProtocol” “ViewController”类没有初始化器
我修复如下:
class ViewController: UIViewController {
var micClient: MicrophoneRecognitionClient?
var isMicrophoneReco: Bool = true
/* Action for pressing the "Start" button */
@IBAction func startButtonTapped(sender: AnyObject) {
if isMicrophoneReco {
var status: OSStatus = micClient!.startMicAndRecognition()
}
}
我得到了
致命错误:在解开可选值 (lldb) 时意外发现 nil
micClient!.startMicAndRecognition()
startButtonTapped 函数内的行。显然,在转换基于 Objective-C 的 API 时,通常将值声明为可选值,尽管它们总是期望返回一个值。但 Swift 需要初始化变量。
我已经为此工作好几天了。 我怎样才能消除这个错误?
第一个错误:
类型“ViewController”不符合“SpeechRecognitionProtocol”类
表示您的类声明它符合
SpeechRecognitionProtocol
但未实现所需的方法。
我只能猜测 SpeechRecognitionProtocol
来自 here,并且您没有实现所有必需的方法。
只需删除它即可修复编译时错误,但您会失去 SpeechRecognitionProtocol
功能,这取决于您是否想要它。
第二个错误:
“ViewController”没有初始化器
是因为 swift 中的所有实例变量都必须在声明时初始化,或者在类 init 方法中初始化,或者声明可选(或作为隐式解包可选)。
解决第二个错误的方法是将
micClient
声明为可选。然而,在 startButtonTapped
中,你强制解开它,并且由于你没有在任何地方初始化 micClient
,所以它为零,并且你会得到运行时异常。
要解决此问题,您需要在某个时候初始化 micClient
。
var status: OSStatus = micClient!.startMicAndRecognition()
!
意味着你正在强制展开这个对象,如果它不存在,它就会破裂,所以你可以将它包装在 guard
语句或 if let
中,所以在该行之前做类似这样的事情
guard let client = micClient as? MicrophoneRecognitionClient else {
NSAssertFailure("error No MicrophoneClient")
}
client.startMicAndRecognition()