Max*_*Max 18 facebook ios afnetworking swift3 xcode8
我在Xcode 7.3中使用swift 2.2版本进行了工作.现在我已经更新了Xcode 8并迁移到swift 3.现在我的项目包含特别针对像afnetworking成功块这样的块的错误.
这给出了错误
Cannot convert value of type '() -> ()' to expected argument type '((URLSessionDataTask, Any?) -> Void)?'
Run Code Online (Sandbox Code Playgroud)
根据swift 3,我不明白如何解决这个问题.
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代码中的参数没有可为空性属性(如nonnull或nullable),则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)
但你需要记住它们现在是可选的.
总之一些转换规则可能会影响您回调代码:
id参数,在Swift 3.0中它将具有类型Any而不是AnyObjectMax*_*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)
这里也是我已删除型号规格result和error和问题就解决了.并在整个应用程序中遵循这一点,它工作.我可以毫无错误地运行项目,并且它正在运行.谢谢.
| 归档时间: |
|
| 查看次数: |
12676 次 |
| 最近记录: |