完成处理程序的错误在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也有类似的错误。
这给出了错误
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
nullable
或nullable
),则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 }
正如你所看到的,现在它正在使用Any
types,而不是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代码的转换规则:
- 如果在objective-c中没有指定可为空属性,则闭包参数是可选的
- 所有“NS”前缀在Swift中都被删除了
- 如果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) } } })
这里关于问题的错误是在dataTask
和responseObj
指定的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() } } }) }
这里也删除了result
types说明,解决了error
和问题。 并在整个应用程序中遵循这一点,它的工作。 我可以运行该项目没有错误,也是工作。 谢谢。
- 如何使用Graph API下载上传到私人Facebook群组的文件
- 如何从iOS中的Facebook SDK获取用户信息?
- 如何在ios中获取Facebook用户信息
- Facebooklogin后更改视图控制器
- iOS App Store中的Facebook Likebutton的链接是什么?
- IOS Facebook的SDK – 发布打开graphics和时间轴上显示,无需点击活动日志
- 使用FBWebdialogs发布给朋友墙
- 在LSApplicationQueriesSchemes下的Info.plist中缺lessfbauth2,并且是iOS 9.0所必需的
- 使用Open Graph的iOS Facebook发布失败 – 错误代码102