完成处理程序的错误在Swift 3和Xcode 8中

我有工作在Xcode 7.3与迅速2.2版本的项目。 现在我已经更新了Xcode 8并迁移到swift 3.现在我的项目包含错误,特别是像成功块的移植。

在网络传播方法中出现错误的快照

这给出了错误

Cannot convert value of type '() -> ()' to expected argument type '((URLSessionDataTask, Any?) -> Void)?' 

我不明白如何解决这个工作,以迅速3。

而Facebooklogin也有类似的错误。

Facebook登录错误

这给出了错误

 Cannot convert value of type '(FBSDKLoginManagerLoginResult!, NSError!) -> Void' to expected argument type 'FBSDKLoginManagerRequestTokenHandler!' 

 Cannot convert value of type '(_, _, NSError!) -> Void' to expected argument type 'FBSDKGraphRequestHandler!' 

这一切错误都与swift中的处理程序块有关。我不明白错误,所以无法解决。 任何帮助将不胜感激。 提前致谢。

对于脸书 – 问题是关于将Swift的Objective-C函数参数转换为新的Swift规则。

以前,如果在Objective-C代码中的参数没有可为空属性(如nonnull nullablenullable ),则Swift会将其转换为! 使他们不可选(强制解包)。 现在它转换为? 使他们可选。 那为什么你得到一个错误。 在您作为login回拨之前:

 (FBSDKLoginManagerLoginResult!, NSError!) -> Void 

现在你需要把:

 (FBSDKLoginManagerLoginResult?, Error?) -> Void 

另外,如你所见,现在你将看不到NSError类。 而不是Swift会把Error 。这也是新的规则。 现在,所有在类名前缀的“NS”在Swift( NSObject – > Object ; NSError – > Error )中被删除。

Swift 3.0的Facebooklogin工作代码示例:

 let manager = FBSDKLoginManager() manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) { (loginResult: FBSDKLoginManagerLoginResult?, error: Error?) in } 

Swift 3.0中facebook请求的工作代码示例:

 let request = FBSDKGraphRequest() request.start { (connection: FBSDKGraphRequestConnection?, result: Any?, error: Error?) in } 

正如你所看到的,现在它正在使用Anytypes,而不是Objective-C id 。 在Swift 2.2中,它使用AnyObject 。 这也是新的Swift转换规则。

您不需要指定callback参数types。 我在代码中强调了它们的真实types。 所以你可以不用编写代码:

 let manager = FBSDKLoginManager() manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) { (loginResult, error) in } let request = FBSDKGraphRequest() request.start { (connection, result, error) in } 

但是你需要记住,他们现在是可选的。

总结一些可能会影响你callback代码的转换规则:

  1. 如果在objective-c中没有指定可为空属性,则闭包参数是可选的
  2. 所有“NS”前缀在Swift中都被删除了
  3. 如果objective-c函数具有id参数,那么在Swift 3.0中它将具有typesAny而不是AnyObject

虽然在这之前我不知道错误是什么Xcode想告诉我有关错误,但我已经删除与对象的types说明,它的工作。

 manager.post(methodname, parameters: param, progress: nil, success:{ (dataTask, responseObj) in if let dict : NSDictionary = responseObj as? NSDictionary { print("Response of \(methodname) : \(dict)") if dict.object(forKey: "response") as? String == "success" { CompletionHandler(true, dict) } else { CompletionHandler(false, dict) } } }) 

这里关于问题的错误是在dataTaskresponseObj指定的types中给出的。 删除types后,它工作正常。

和facebooklogin一样

 @IBAction func fbLoginClicked(_ sender: AnyObject) { let app = UIApplication.shared.delegate as! AppDelegate app.fbLoginManager = FBSDKLoginManager() app.fbLoginManager.logOut() app.fbLoginManager.loginBehavior = FBSDKLoginBehavior.native app.fbLoginManager.logIn(withReadPermissions: ["email"], from: self, handler: { (result, error) -> Void in if error != nil { print(error?.localizedDescription) } else { if (result! as FBSDKLoginManagerLoginResult).isCancelled == true { } else { self.fetchFacebookUserDetail() } } }) } 

这里也删除了resulttypes说明,解决了error和问题。 并在整个应用程序中遵循这一点,它的工作。 我可以运行该项目没有错误,也是工作。 谢谢。