创建一个内联闭包

时间:2016-11-30 13:19:16

标签: ios closures swift3

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

如何通过完成?这是一个错误。

3 个答案:

答案 0 :(得分:0)

这不是一个真正的关闭。

签名需要类似

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

声明的berror变量无用,因为从方法返回berror

答案 1 :(得分: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)
          }
       }
}

答案 2 :(得分:0)

您的completion不是关闭。它应该像

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

我假设你希望你的WKWebView表现得像某些Javascript评估失败。如果是这种情况,您可以:

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