2016-07-15 79 views
5

所以我们可以说我有一个这样的类:如何在swift(Reflection/Mirror)中动态地查找属性的类型?

class Employee: NSObject { 
    var id: String? 
    var someArray: [Employee]? 
} 

我使用反射来获取属性名称:

let employee = Employee() 
let mirror = Mirror(reflecting: employee) 
propertyNames = mirror.children.flatMap { $0.label } 
// ["businessUnitId", "someArray"] 

越远越好!现在我需要能够找出每个属性的类型,所以如果我执行employee.valueForKey("someArray"),它将不起作用,因为它只给出了AnyObject类型。什么是最好的方法来做到这一点?特别是对于数组,我需要能够动态地指出该数组包含Employee的类型。

回答

12

你不需要从NSObject继承(除非你有充分的理由)。

class Employee { 
    var id: String? 
    var someArray: [Employee]? 
} 

let employee = Employee() 

for property in Mirror(reflecting: employee).children { 
    print("name: \(property.label) type: \(type(of: property.value))") 
} 

输出

name: Optional("id") type: Optional<String> 
name: Optional("someArray") type: Optional<Array<Employee>> 

这也适用于对于结构

+1

这正是我一直在寻找的! –

+1

如果值为零,property.value.dynamicType返回nil – shahid610169

+0

谢谢如此如此如此 –

0
employee.valueForKey("someArray")!.dynamicType 
0

如果从NSObject继承,你可以使用一些由NSCoding提供的方法和Objective-C的运行时间:

let employee = Employee() 
employee.someArray = [] 
employee.valueForKey("someArray")?.classForCoder // NSArray.Type 
employee.valueForKey("someArray")?.classForKeyedArchiver // NSArray.Type 
employee.valueForKey("someArray")?.superclass // _SwiftNativeNSArrayWithContiguousStorage.Type