你如何处理 return Any 的闭包?输入 swift?

How do you handle closures that return Any? type in swift?

我注意到有时调用函数 returns Any?类型。

一个这样的例子是 Facebook 登录 iOS SDK 中的 AccessToken.refreshCurrentAccessToken 方法。

返回的数据类型为“Any?”

当你不知道它包含什么时,你如何正确处理这个类型?

预期和处理 returns Any 函数的正确方法是什么?输入 swift?

示例:

 AccessToken.refreshCurrentAccessToken { (connection:GraphRequestConnection?, data:Any?, error:Error?) in
    if error != nil {
        print("error")
        return
    }
            
    print("no error: data is /(data)")
 }

在这种情况下,调试器中的数据returns如下。但是没有办法提前知道里面有什么。

(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

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

An optional callback handler that can surface any errors related to permission refreshing.

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

if let d = data as? Data {

}

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

然后,在 { } 中,如果匹配成功,您可以访问键入的版本。但是,同样,您必须知道您可能会遇到哪些类型才能进行此类测试。