如何在swift中动态找到属性的类型(Reflection / Mirror)?

时间:2016-07-15 14:43:30

标签: ios swift reflection

所以,让我说我有一个这样的课程:

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的类型。

3 个答案:

答案 0 :(得分:13)

您不需要继承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>>
  

这也适用于Structs

答案 1 :(得分:0)

employee.valueForKey("someArray")!.dynamicType

答案 2 :(得分: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