如何检查任何类型的变量是否为数组

How to check if an variable of any type is an array

我尝试将 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
}

以上代码可以按预期工作。 但是,我的问题是,我有很多协议,我不想一一检查。新增协议不友好

有什么方便的方法可以检查上面的 "value" 是否是下面的一种数组?

if let _ = value as? [Any]{
    print("type check successed")    //never enter here
}

编辑:

受 Rohit Parsana 的回答启发,下面的代码可以工作:

if let arrayType = value?.dynamicType{
    let typeStr = "\(arrayType)"
    if typeStr.contains("Array"){
         print(typeStr)
    }
}

但是这些代码似乎不够安全,例如,你可以声明一个名为"abcArray"的class。

虽然我们可以使用正则表达式来检查"typeStr"是否匹配"Array<*>",但似乎太棘手了。

有没有更好的解决方案?

您可以使用 'dynamicType' 检查值的类型,这里是示例代码...

if "__NSCFArray" == "\(page.dynamicType)" || "__NSArrayM" == "\(page.dynamicType)"
    {
        print("This is array")
    }
    else
    {
        print("This is not array")
    }

你可以使用反射:

if value != nil {
    let mirror = Mirror(reflecting: value!)
    let isArray = (mirror.displayStyle == .Collection)
    if isArray {
        print("type check succeeded")
    }
}