Как я могу проверить (отражение), является ли свойство массивом (любого типа)?

Как я могу проверить, является ли свойство Array (любого типа)? Этот код всегда печатает только «Рабочий». Есть ли способ (динамически) узнать, является ли свойство Array без указания типа?

final class Worker: NSObject {

    var id: Int?
    var array: Array<Worker>?

}


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let worker = Worker()
        worker.id = Int(2) as Int?
        worker.array = [Worker(),Worker(),Worker()]

        let mirror = reflect(worker)

        for i in 0..<mirror.count {

            let (name, childMirror) = mirror[i]

            if childMirror.disposition == .Optional {

                let (newName,subChildMirror) = childMirror[0]

                if subChildMirror.valueType is Array<AnyClass>.Type {
                    println("AnyClass")
                }
                if subChildMirror.valueType is Array<AnyObject>.Type {
                    println("AnyObject")
                }
                if subChildMirror.valueType is Array<Any>.Type {
                    println("Any")
                }
                if subChildMirror.valueType is Array<NSObject>.Type {
                    println("NSObject")
                }
                if subChildMirror.valueType is Array<Worker>.Type {
                    println("Worker")
                }

            }

        }

    }
}

Ps.: Мне нужно разобраться с Array<>


person Klevison    schedule 17.09.2015    source источник
comment
возможный дубликат совпадения Swift Pattern в массиве‹Any›   -  person Dániel Nagy    schedule 17.09.2015


Ответы (1)


Массив любого типа всегда можно привести к NSArray. Таким образом, вы можете проверить, является ли это массивом с таким кодом:

if _ = subChildMirror.valueType as? NSArray {
      println("Array")
}

Также возможно динамически получать тип объектов этого массива. В моей библиотеке EVReflection я делаю что-то подобное. Я расширил массив, чтобы получить новый элемент объекта, который должен быть в этом массиве. В вашем случае вы можете получить .dynamicType из объекта dat.

Таким образом, код станет:

let arrayType = worker.array.getTypeInstance().dynamicType

Вот расширение массива

extension Array {
    /**
    Get the type of the object where this array is for

    :returns: The object type
    */
    public func getTypeInstance<T>(
        ) -> T {
            let nsobjectype : NSObject.Type = T.self as! NSObject.Type
            let nsobject: NSObject = nsobjectype.init()
            return nsobject as! T
    }
}
person Edwin Vermeer    schedule 22.10.2015