首页 > 解决方案 > 你如何处理返回 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

标签: swiftfunctionclosuresany

解决方案


在这种特定情况下,该参数中似乎不会返回任何有用的信息。根据文档:

一个可选的回调处理程序,可以显示与权限刷新相关的任何错误。

在更一般的意义上,您必须知道一些关于Any?可能包含的信息,然后您可以进行类型匹配,as?例如:

if let d = data as? Data {

}

请参阅:https ://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html

然后,{ }如果它成功通过匹配,您可以在里面访问键入的版本。但是,再次,你必须知道你可能会遇到什么类型来做这样的测试。


推荐阅读