2017-05-16 1 views
0

類似のタイトルを持つ複数のものがあるにもかかわらず、私は同じ問題を持つものを見つけることができなかったので、私はこの質問をしました。コールバック関数を呼び出す関数があります。この2番目の関数は、コールバックを持つ別の関数を別の呼び出しにします。私の問題は、呼び出されている3番目の関数は.mファイルの中にあり、これはブリッジを通して私がアクセスできることです。この関数は、エラーがなければnilを返します。問題は、私は、コールバック関数にnilを許すことができませんし、それがエラーを返すということです。コールバック関数のオプション値のアンワップ

致命的なエラー:予期せずに任意の値

をアンラップしながら、私は迅速に新しいですnilを発見し、私が読んだものからオプションを使用することは良い方法ですが、それでも問題はあります。何か案は?

コード:

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

コールバックがオプションを持っている場合は、なぜあなたは強制的にアンラップされ、それを?

詳細はありませんでした。

これらはどちらも選択肢ですが、エラー1のアンラップを強制します。フェッチの前にちょうどこの操作を行うに行くのテキストについては

callback(details, error) 

::。このようにコールバックを使用し

guard let itemText = itemTextField.text else { return } 

それともあなたも空の文字列で関数を呼び出すしたい場合は、これを行うことができます

let itemText = itemTextField.text ?? "" 

そして、そのように品目テキストを使用します。

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

ありがとうございました!私はあなたがお勧めしたことを試しましたが、残念ながらサービスfuncでもエラーが発生しましたが、funcルックアップを追加することをお勧めします(item:String !,コールバック:関数ラインでキーワードをエスケープしますか?) – paul590

+1

致命的なエラー:値 - このエラーは、値をnilとし、これを使用してラップを解除したことを意味します(回避しないようにしてください)なぜあなたはvarサービスを宣言したのでしょうか?ただちに初期化するのですか? スウィフト3を使用している場合は、間違いなく@escapingを追加してください。あなたのコードにはそれがないためではないと思われました。勇気を使って(!) –

+0

ありがとうございました!私はあなたの助けに感謝します! – paul590

関連する問題