2017-05-16 79 views
0

我提出這個問題,因爲即使有多個標題類似的標題,我也無法找到具有相同問題的標題。我有一個函數調用有回調函數。這第二個函數調用另一個具有回調的函數。我的問題是,被調用的第三個函數是在一個.m文件中,通過一個橋樑我可以訪問它。如果沒有錯誤,該函數返回nil。問題是,我不能讓零的回調函數,它返回錯誤:在回調函數中展開一個可選值swift

致命錯誤:意外發現零而展開的可選值

我是新來的迅速,從我已閱讀使用可選項是一個好方法,但它仍然存在問題。有任何想法嗎?

代碼:

mainViewController.swift

func makeACall(){ 
    var service:Service! 
    service = Service() 

    // error happens on this next line I believe is the error variable 
    service.lookup(item: itemTextField.text, callback: { (details:String?, error: serviceError?) -> Void in 

    if (error != nil){ 
    //do something 
    } 

    }) 
} 

Service.swift

func lookup(item:String!, callback: (_ details:String?, _ error: serviceError?) -> Void){ 

super.fetchItem(item, callback: { (details:String?, error: serviceError?) -> Void in 
    callback(details, error!) 

}) // in objective C .m file fetchItem returns the call back as callback(details, nil) if no error 

} 

回答

1

如果您的回調有一個可選的,你爲什麼要強制展開呢?

你沒有提供細節。

這兩個都是可選項,但你強制解開錯誤之一。使用回叫這樣的:

callback(details, error) 

至於文本將在就在這樣做的獲取:

guard let itemText = itemTextField.text else { return } 

或者,如果你想與你可以這樣做一個空字符串,即使調用函數

let itemText = itemTextField.text ?? "" 

然後用itemText像這樣:

service.lookup(item: itemText, callback: { (details:String?, error: serviceError?) -> Void in 
    if (error != nil){ 
    //do something 
    } 
}) 
+0

謝謝你或你的幫助!我嘗試了你的建議,但不幸的是,錯誤仍然發生,同樣在服務func上,你會推薦添加func lookup(item:String !,回調:函數行中的轉義關鍵字?) – paul590

+1

致命錯誤:意外地發現nil,同時展開一個可選值 - 這個錯誤意味着一個值爲零,你用爆炸(!)解開它,儘量避免它們,我也不明白你爲什麼聲明你的var服務:Service!就像你做的那樣。只是直接初始化它? 是的definetly添加@escaping如果你正在使用swift 3你需要它我只是假設你不是因爲你的代碼沒有它編輯:要清楚 - 你的崩潰不會發生,如果你停止使用劉海(!)。 –

+0

非常感謝你!感謝你的幫助! – paul590

相關問題