将 Objective-C 框架连接到 Swift iOS 项目(SpeechSDK 框架)时的致命错误



我按原样转换了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()

最新更新