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

问题描述 投票:0回答:2

我按原样转换了 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 需要初始化变量。

我已经为此工作好几天了。 我怎样才能消除这个错误?

ios swift objective-c speech-recognition
2个回答
0
投票

第一个错误:

类型“ViewController”不符合“SpeechRecognitionProtocol”类

表示您的类声明它符合

SpeechRecognitionProtocol
但未实现所需的方法。 我只能猜测
SpeechRecognitionProtocol
来自 here,并且您没有实现所有必需的方法。 只需删除它即可修复编译时错误,但您会失去
SpeechRecognitionProtocol
功能,这取决于您是否想要它。

第二个错误:

“ViewController”没有初始化器

是因为 swift 中的所有实例变量都必须在声明时初始化,或者在类 init 方法中初始化,或者声明可选(或作为隐式解包可选)。

解决第二个错误的方法是将

micClient
声明为可选。然而,在
startButtonTapped
中,你强制解开它,并且由于你没有在任何地方初始化
micClient
,所以它为零,并且你会得到运行时异常。 要解决此问题,您需要在某个时候初始化
micClient


0
投票
 var status: OSStatus = micClient!.startMicAndRecognition()

!
意味着你正在强制展开这个对象,如果它不存在,它就会破裂,所以你可以将它包装在
guard
语句或
if let
中,所以在该行之前做类似这样的事情

 guard let client = micClient as?  MicrophoneRecognitionClient else {
      NSAssertFailure("error No MicrophoneClient")
 }
 client.startMicAndRecognition()
© www.soinside.com 2019 - 2024. All rights reserved.