gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 08:11:08 25 4
gpt4 key购买 nike

我在 Xcode 7.3 中有一个 swift 2.2 版本的工作项目。现在我已经更新了 Xcode 8 并迁移到 swift 3。现在我的项目包含专门针对 afnetworking 的成功 block 等 block 的错误。

Snapshot for error in afnetworking post method

给出的错误为

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

我不明白如何按照 swift 3 解决这个问题。

Facebook登录也有同样的错误。

Facebook Login error

给出的错误为

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 3 中的处理程序 block 有关。我不理解这些错误,因此无法解决。任何帮助将不胜感激。提前致谢。

最佳答案

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

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

(FBSDKLoginManagerLoginResult!, NSError!) -> Void

现在你需要输入:

(FBSDKLoginManagerLoginResult?, Error?) -> Void

此外,如您所见,现在您将看不到 NSError 类。而不是 Swift 将放置 Error。这也是新规则。现在,类名中所有前缀为 "NS" 的 Swift 都被移除了(NSObject -> Object; NSError -> 错误)。

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 }

但您需要记住,它们现在是可选的。

总结一些可能影响回调代码的转换规则:

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

关于ios - 完成处理程序在 swift 3 和 Xcode 8 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39508868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com