所以,让我说我有一个这样的课程:
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
的类型。
答案 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