我按原样转换了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()
}
}
我收到以下错误:
类型"视图控制器"不符合"语音识别协议"类"视图控制器"没有初始值设定项
我修复如下:
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()
行内开始按钮点击功能。显然,在转换基于 Objective-C 的 API 时,通常会将值声明为可选值,尽管它们总是期望返回一个值。但是 Swift 需要初始化变量。
我已经为此工作了好几天了。 如何消除此错误?
第一个错误:
类型"视图控制器"不符合"语音识别协议"类
表示您的类声明它符合SpeechRecognitionProtocol
但不实现所需的方法。我只能猜测SpeechRecognitionProtocol
来自这里,而您没有实现所有必需的方法。只需删除它即可修复编译时错误,但您将丢失SpeechRecognitionProtocol
功能,这取决于您是否需要它。
第二个错误:
"视图控制器"没有初始值设定项
这是因为 Swift 中的所有实例变量都必须在声明时初始化,或者在其类 init 方法中初始化,或者声明为可选(或作为隐式解包的可选)。
第二个错误的解决方法是将micClient
声明为可选。但是,startButtonTapped
您强制解包它,并且由于您没有在任何地方初始化micClient
,因此它是 nil,并且您会收到运行时异常。要解决此问题,您需要在某个时候初始化micClient
。
var status: OSStatus = micClient!.startMicAndRecognition()
!
意味着您正在强制解开此对象的包装,如果它不存在,它将断开,因此您可以将其包装在 guard
语句或if let
所以在那行之前做这样的事情
guard let client = micClient as? MicrophoneRecognitionClient else {
NSAssertFailure("error No MicrophoneClient")
}
client.startMicAndRecognition()