Arrays Swift 5:如何测试任何对象?它的变量';s值';s型?
我目前正在将iOS应用程序从Objective-C移植到Swift。在这样做的时候,我偶然发现了一个我正在努力解决的问题 我有一个变量(“值”),可以设置为AnyObject?,特别是可以是String、Array、Dictionary和set类型。现在,在我以前的代码中,我正在测试“value”变量的值类型,以便进一步使用它: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
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
是如何定义的?这可能会返回一个包含该值的枚举。这样,您可以打开枚举以从中获取基础值。