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

会有一股神秘感。 提交于 2020-01-01 19:10:14

问题


I tried to cast a swift protocol array as any array, but failed.

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
}

Above code could work as expected. However, my problem is, I have a lot of protocols, and I don't want to check them one by one. It is not friendly to add new protocol.

Is there any convenience way to do check if above "value" is a kind of array like below?

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

edit:

Inspired by Rohit Parsana's answer, below code could work:

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

But these code seems not safe enough, for example, you can declare a class named "abcArray".

Although we could use regular expression to check if "typeStr" matches "Array<*>", it seems too tricky.

Is there any better solution?


回答1:


You can use reflection:

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



回答2:


You can check the type of value using 'dynamicType', here is the sample code...

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


来源:https://stackoverflow.com/questions/39443846/how-to-check-if-an-variable-of-any-type-is-an-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!