对于Facebook而言,问题出在新的Swift规则上,该规则涉及将Objective-C函数参数转换为Swift。
以前,在Objective-C代码中,如果参数没有空值属性(如nonnull
或nullable
),Swift会使用!
将其转换为非可选类型(强制解包)。现在它使用?
将其转换为可选类型。这就是为什么您会收到错误信息。在此之前,您将其作为登录回调函数:
(FBSDKLoginManagerLoginResult!, NSError!) -> Void
现在你需要放置:
(FBSDKLoginManagerLoginResult?, Error?) -> Void
同时你会注意到,现在你将不会看到 NSError
类了。取而代之的是Swift会用 Error
。这也是新规则。现在所有类名中以 "NS" 为前缀的部分都被删除了(例如:NSObject
-> Object
; NSError
-> Error
)。
以下是在 Swift 3.0 中使用 Facebook 登录的代码示例:
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
类型而不是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 }
但是你需要记住,现在它们是可选的。
总之,以下是一些可能会影响您回调代码的转换规则:
- 如果在 Objective-C 中未指定空值属性,则闭包参数是可选的。
- 在 Swift 中,所有 "NS" 前缀都被移除了。
- 如果 Objective-C 函数有
id
参数,在 Swift 3.0 中它将使用 Any
类型而不是 AnyObject
类型。