Arrays Swift 5:如何测试任何对象?它的变量';s值';s型?

Arrays Swift 5:如何测试任何对象?它的变量';s值';s型?,arrays,objective-c,swift,typeof,anyobject,Arrays,Objective C,Swift,Typeof,Anyobject,我目前正在将iOS应用程序从Objective-C移植到Swift。在这样做的时候,我偶然发现了一个我正在努力解决的问题 我有一个变量(“值”),可以设置为AnyObject?,特别是可以是String、Array、Dictionary和set类型。现在,在我以前的代码中,我正在测试“value”变量的值类型,以便进一步使用它: id value = [myDatahandler getValue]; if (([value isKindOfClass:[NSSet class]] || [v

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

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

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'
}
经过几个小时的寻找正确的方法来做这件事,但没有找到任何有用的,我希望社区能来拯救我这里


有什么建议吗?

我觉得你可以用一个警卫来做这件事。。希望下面的代码能够正常工作

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

print(value)

我觉得你可以用一个警卫来做这件事。。希望下面的代码能够正常工作

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

print(value)

使用
Any
而不是
AnyObject
,因为

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

Any指的是类、结构或枚举的任何实例——字面上指的是任何东西。在Swift中,当类型未知或以有意义的分类方式混合时,您将看到这一点:

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

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

使用
Any
而不是
AnyObject
,因为

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

Any指的是类、结构或枚举的任何实例——字面上指的是任何东西。在Swift中,当类型未知或以有意义的分类方式混合时,您将看到这一点:

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

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

问题是
Set
Array
都是通用类型。必须提供元素类型

例如,如果您希望它们包含
字符串

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

}

问题是
Set
Array
都是通用类型。必须提供元素类型

例如,如果您希望它们包含
字符串

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

}

通常的方法是通过使用协议或枚举之类的东西来消除“Any”。我不能提供一个具体的解决方案,但这是我最初的想法。您的
myDataHandler
是如何定义的?这可能会返回一个包含该值的枚举。通过这种方式,您可以打开枚举以从中获取基础值。通常的方法是使用协议或枚举之类的东西来消除“Any”。我不能提供一个具体的解决方案,但这是我最初的想法。您的
myDataHandler
是如何定义的?这可能会返回一个包含该值的枚举。这样,您可以打开枚举以从中获取基础值。