2016-07-15 76 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