swift - 你如何处理返回 Any 的闭包?快速输入?
问题描述
我注意到有时调用函数会返回 Any? 类型。
一个这样的例子是 Facebook Login iOS SDK 中的 AccessToken.refreshCurrentAccessToken 方法。
返回的数据类型为“任何?”
当您不知道它包含什么时,您如何正确处理这种类型?
预测和处理返回 Any 的函数的正确方法是什么?快速输入?
例子:
AccessToken.refreshCurrentAccessToken { (connection:GraphRequestConnection?, data:Any?, error:Error?) in
if error != nil {
print("error")
return
}
print("no error: data is /(data)")
}
在这种情况下,数据在调试器中返回以下内容。但是没有办法提前知道里面有什么。
(lldb) po data
▿ Optional<Any>
▿ some : 1 element
▿ 0 : 2 elements
- key : data
▿ value : 3 elements
▿ 0 : 2 elements
▿ 0 : 2 elements
- key : status
- value : granted
▿ 1 : 2 elements
- key : permission
- value : email
▿ 1 : 2 elements
▿ 0 : 2 elements
- key : status
- value : granted
▿ 1 : 2 elements
- key : permission
- value : openid
▿ 2 : 2 elements
▿ 0 : 2 elements
- key : status
- value : granted
▿ 1 : 2 elements
- key : permission
- value : public_profile
解决方案
在这种特定情况下,该参数中似乎不会返回任何有用的信息。根据文档:
一个可选的回调处理程序,可以显示与权限刷新相关的任何错误。
在更一般的意义上,您必须知道一些关于Any?
可能包含的信息,然后您可以进行类型匹配,as?
例如:
if let d = data as? Data {
}
请参阅:https ://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html
然后,{ }
如果它成功通过匹配,您可以在里面访问键入的版本。但是,再次,你必须知道你可能会遇到什么类型来做这样的测试。
推荐阅读
- swift - 致命错误:在隐式展开可选值时意外发现 nil
- c# - WPF TreeView 分层数据绑定到对象模型
- python-3.x - 将文件传递给函数时,如何使用 Try except 来捕获 FileNotFoundError?
- react-native - 如何在本机反应中将常量作为参考?
- logging - 使用 SF CLI (sfctl) 查看 Azure Service Fabric 中的日志
- angular - angular/cdk 给出了很多构建错误
- android - CameraX cameraView 和 previewView
- javascript - 如何使用jquery将关注按钮从关注更改为关注
- mysql - Redis和mysql的qps是多少
- git - 将一个 git 存储库复制到另一个具有历史记录的存储库