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

Max*_*Max 18 facebook ios afnetworking swift3 xcode8

我在Xcode 7.3中使用swift 2.2版本进行了工作.现在我已经更新了Xcode 8并迁移到swift 3.现在我的项目包含特别针对像afnetworking成功块这样的块的错误.

afnetworking post方法中的错误快照

这给出了错误

Cannot convert value of type '() -> ()' to expected argument type '((URLSessionDataTask, Any?) -> Void)?'
Run Code Online (Sandbox Code Playgroud)

根据swift 3,我不明白如何解决这个问题.

Facebook登录也有同样的错误.

Facebook登录错误

这给出了错误

Cannot convert value of type '(FBSDKLoginManagerLoginResult!, NSError!) -> Void' to expected argument type 'FBSDKLoginManagerRequestTokenHandler!'
Run Code Online (Sandbox Code Playgroud)

Cannot convert value of type '(_, _, NSError!) -> Void' to expected argument type 'FBSDKGraphRequestHandler!'
Run Code Online (Sandbox Code Playgroud)

这个所有错误都与swift 3中的处理程序块有关.我不理解错误,因此无法解决.任何帮助将不胜感激.提前致谢.

Vas*_*mil 14

对于Facebook - 问题在于关于将objective-c函数参数转换为Swift的新Swift规则.

以前,如果objective-c代码中的参数没有可为空性属性(如nonnullnullable),则Swift将其转换!为非可选(强制解包).现在它转换它?使它们可选.这就是你收到错误的原因.在您作为登录回调之前:

(FBSDKLoginManagerLoginResult!, NSError!) -> Void
Run Code Online (Sandbox Code Playgroud)

现在你需要把:

(FBSDKLoginManagerLoginResult?, Error?) -> Void
Run Code Online (Sandbox Code Playgroud)

此外,如你所见,现在你不会看到NSError课程.而不是斯威夫特会放Error.这也是新规.现在,在Swift(- > ; - > )中删除了类名称前缀的所有"NS". NSObjectObjectNSErrorError

在Swift 3.0中登录facebook的工作代码示例:

let manager = FBSDKLoginManager()

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

}
Run Code Online (Sandbox Code Playgroud)

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

let request = FBSDKGraphRequest()

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

}
Run Code Online (Sandbox Code Playgroud)

如您所见,现在它使用的是Anytype而不是objective-c id.在Swift 2.2中它正在使用AnyObject.这也是新的Swift转换规则.

您不需要指定回调参数类型.我在代码中用它来突出显示它们的真实类型.所以你可以不用它们编写代码:

let manager = FBSDKLoginManager()

manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) { (loginResult, error) in }


let request = FBSDKGraphRequest()

request.start { (connection, result, error) in }
Run Code Online (Sandbox Code Playgroud)

但你需要记住它们现在是可选的.

总之一些转换规则可能会影响您回调代码:

  1. 如果在objective-c中没有指定nullability属性,则闭包参数是可选的
  2. 对于Swift中的objective-c类,删除了所有"NS"前缀
  3. 如果objective-c函数有id参数,在Swift 3.0中它将具有类型Any而不是AnyObject


Max*_*Max 13

虽然我之前不知道Xcode想要告诉我有关错误的错误,但我已经删除了带有对象的类型规范并且它有效.

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


                }

        })
Run Code Online (Sandbox Code Playgroud)

这里关于问题错误给出,dataTask并且responseObj指定了类型.删除类型后它工作正常.

与facebook登录相同

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

    }
Run Code Online (Sandbox Code Playgroud)

这里也是我已删除型号规格resulterror和问题就解决了.并在整个应用程序中遵循这一点,它工作.我可以毫无错误地运行项目,并且它正在运行.谢谢.