2016-11-30 9 views
0

WKWebViewでは、メソッドevaluateJavaScriptがあります。私はこのメソッドをオーバーライドしてカスタムコードを追加しました。クロージャをインラインで作成する

override open func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Swift.Void)? = nil) 
{ 
     let b:Bool? = true 
     let error: Error? = NSError(domain: "com.My.Tests", code: 1000, userInfo: nil) as Error 
     let completion = (b, error) -> Void 
     evaluateJavaScript(javaScriptString, completionHandler: completion) 
} 

どのように完了を渡すには?それは間違いを投げている。

+0

使用しているSwiftのバージョンによって異なります。 –

+0

私は質問を更新しました。 –

+0

* "これはエラーを投げています。" * - 何のエラー? – luk2302

答えて

0

これは本当の閉鎖ではありません。

署名が

let completion = { (b, error) in print(b, error) } 

のようなものを期待しberrorがメソッドから返されたので、宣言berror変数は無用です。

0
override open func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Swift.Void)? = nil) 
{ 
     let b:Bool? = true 
     let error: Error? = NSError(domain: "com.My.Tests", code: 1000, userInfo: nil) as Error 
     evaluateJavaScript(javaScriptString) { (result, error) in 
      if error != nil { 
      completionHandler?(nil, error) 
      } else { 
      completionHandler?(result, nil) 
      } 
     } 
} 
0

completionはクロージャではありません。それは私があなたのWKWebView評価が失敗したいくつかのJavascriptのように行動したいと仮定しています

let completion = { (b: Any?, error: Error?) -> Void in 
    print("\(error)") 
} 

のようなものでなければなりません。そのような場合、あなたはどちらかと思います:

override func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil) { 
    evaluateJavaScript(javaScriptString) { b, error in 
     completionHandler?(true, NSError(domain: "com.My.Tests", code: 1000)) 
    } 
} 

それとも、あなたが本当にJavascriptを評価する必要はありませんでしたが、ちょうど(例えば、テストでそれをスタブ)の障害のようなを見れば:

override func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil) { 
    completionHandler?(true, NSError(domain: "com.My.Tests", code: 1000)) 
} 
関連する問題