【问题标题】:Swift 5: How to test an AnyObject? variable for it's value's type?Swift 5:如何测试 AnyObject?它的值类型的变量?
【发布时间】:2020-05-01 16:29:09
【问题描述】:

我目前正在将 iOS 应用程序从 Objective-C 移植到 Swift。在这样做时,我偶然发现了一个我正在努力解决的问题。

我有一个可以设置为 AnyObject 的变量(“值”),尤其是它可以是 String、Array、Dictionary 和 Set 类型。现在,在我之前的代码中,我正在测试我的“值”变量的值类型,以便进一步使用它:

id value = [myDatahandler getValue];

if (([value isKindOfClass:[NSSet class]] || [value isKindOfClass:[NSArray class]]) && [value count] > 0) {
        // do something
}

尝试在 Swift 中做同样的事情似乎行不通...

var value: AnyObject? = myDatahandler.getValue()

if (value is Set || value is Array) && value!.count > 0 {
        // Error:
        // Generic parameter 'Element' could not be inferred in cast to 'Array'
        // Generic parameter 'Element' could not be inferred in cast to 'Set'
}

经过几个小时寻找正确的方法,但没有找到任何有用的东西,我希望社区可以在这里拯救我......

有什么建议吗?

【问题讨论】:

  • 类似这样的常用方法是通过使用协议或枚举之类的东西来摆脱“任何”。我无法为此提供具体的解决方法,但这是我最初的想法。您的myDataHandler 是如何定义的?也许这可以返回一个包含该值的枚举。这样您就可以打开枚举以从中获取基础值。

标签: arrays objective-c swift typeof anyobject


【解决方案1】:

我觉得您可以使用警卫来执行此操作。希望以下代码有效。

guard let value =  myDatahandler.getValue() as? [Element] , value.count > 0 else {
    return
}

print(value)

【讨论】:

    【解决方案2】:

    使用Any 而不是AnyObject,因为来自HackingWithSwift page

    AnyObject 指的是一个类的任何实例,相当于 Objective-C 中的 id。当您特别想使用引用类型时,它很有用,因为它不允许使用 Swift 的任何结构或枚举。当您想要限制协议以使其只能与类一起使用时,也可以使用 AnyObject。

    Any 指的是类、结构或枚举的任何实例——实际上是任何东西。你会在 Swift 中看到类型未知或以可以有意义分类的方式混合的地方:

    然后,您可以使用保护来解开可选值

    guard let value =  myDatahandler.getValue() as? [YourClass], !value.isEmpty {
       return
    }
    

    【讨论】:

      【解决方案3】:

      问题在于SetArray 都是泛型类型。您必须提供元素类型。

      例如,如果您希望它们包含Strings

      if (value is Set<String> || value is Array<String>) && value!.count > 0 {
      
      }
      

      如果您只关心它是一个数组或集合(而不关心元素类型),您可以使用Any 作为元素类型:

      if (value is Set<Any> || value is Array<Any>) && value!.count > 0 {
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2023-03-30
        • 2023-03-12
        相关资源
        最近更新 更多