我尝试将 swift 协议数组转换为任何数组,但失败了。
protocol SomeProtocol: class{
}
class SomeClass: NSObject, SomeProtocol{
}
let protocolArray: [SomeProtocol] = [SomeClass()]
let value: Any? = protocolArray
if let _ = value as? [SomeProtocol]{
print("type check successed") //could enter this line
}
上面的代码可以按预期工作。
然而,我的问题是,我有很多协议,我不想一一检查它们。添加新协议并不友好。
有没有方便的方法来检查上面的“值”是否是如下所示的一种数组?
if let _ = value as? [Any]{
print("type check successed") //never enter here
}
edit:
受到 Rohit Parsana 答案的启发,下面的代码可以工作:
if let arrayType = value?.dynamicType{
let typeStr = "\(arrayType)"
if typeStr.contains("Array"){
print(typeStr)
}
}
但这些代码似乎不够安全,例如,您可以声明一个名为“abcArray”的类。
虽然我们可以使用正则表达式来检查“typeStr”是否匹配“Array”,但这似乎太棘手了。
还有更好的解决办法吗?
您可以使用反射:
if value != nil {
let mirror = Mirror(reflecting: value!)
let isArray = (mirror.displayStyle == .Collection)
if isArray {
print("type check succeeded")
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)