2016-02-26 37 views
-1

我按原樣轉換了Objective-C語音識別API Swift。將Objective-C框架連接到Swift iOS項目時的致命錯誤(SpeechSDK框架)

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() 
    } 
} 

我得到了以下錯誤:

類型 '視圖控制器' 不符合 '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)

micClient!.startMicAndRecognition() 

startButtonTapped函數內部線。顯然,在轉換基於Objective-C的API時,通常將值聲明爲可選值,但總是希望返回值。但Swift需要初始化變量。

我正在爲此工作數日。我怎樣才能消除這個錯誤?

+0

顯示SpeechRecognitionProtocol的Objective-C聲明請 – matt

+0

抱歉在這裏錯過了您的問題。 [該協議在ViewController.h中聲明](http://stackoverflow.com/questions/35471902/convert-microsoft-project-oxford-speech-recognition-from-objective-c-to-swift) – antbithia

回答

0

的第一個錯誤:

類型「視圖控制器」不符合「SpeechRecognitionProtocol」類

是說,你的類聲明它符合SpeechRecognitionProtocol但不執行所需的方法( S)。 我只能猜測SpeechRecognitionProtocol是從here,你沒有實現所有必需的方法。 只需將其刪除即可修復編譯時錯誤,但會丟失SpeechRecognitionProtocol的功能,這取決於您是否需要它。

第二個錯誤:

「視圖控制器」沒有初始化

是因爲在迅速所有實例變量在聲明時必須被初始化,或者在他們的階級init方法初始化,或者聲明可選(或隱式解包選項)。

解決此第二個錯誤的方法是聲明micClient爲可選項。但是,在startButtonTapped中,您強制展開它,並且由於您沒有在任何地方初始化micClient,因此它是零,並且會得到運行時異常。 要解決這個問題,你需要在某個時候初始化micClient

+0

您可能有導入'SpeechRecognitionService'很好,但爲了實現該協議,您需要在您的視圖控制器中添加委託方法。也就是說,查看SpeechRecognitionService聲明以查看需要的方法,並將它們全部添加到您的視圖控制器類中。 'var micClient:MicrophoneRecognitionClient?'不是一個初始化,它是一個_declaration_。初始化將是'var micClient:MicrophoneRecognitionClient? = MicrophoneRecognitionClient()'或類似的東西。 – paulvs

+0

我有一個包含所有相關頭文件的橋頭文件#import「SpeechSDK/SpeechRecognitionService.h」。它的所有方法都很好。 SpeechRecognitionProtocol如何實現?其次,我如何初始化micClient ?.謝謝 – antbithia

+0

@antbithia你還沒有完成我要求你做的事情,即顯示SpeechRecognitionProtocol聲明。我們不知道它是什麼樣子,所以我們不能將它翻譯成Swift條款。展示下! – matt

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

!意味着你力量展開這個對象,如果它不存在它會打破,所以你可以把它包在guard陳述或if let因此該行之前做這樣的事情

guard let client = micClient as? MicrophoneRecognitionClient else { 
     NSAssertFailure("error No MicrophoneClient") 
} 
client.startMicAndRecognition()