2016-07-15 30 views
5

Quindi diciamo che ho una classe come questa:Come posso trovare il tipo di una proprietà dinamicamente in rapido (Riflessione/Specchio)?

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

Io uso riflessione per ottenere i nomi di proprietà:

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

finora tutto bene! Ora ho bisogno di essere in grado di capire il tipo di ciascuna di queste proprietà, quindi se faccio il employee.valueForKey("someArray"), non funzionerà perché mi dà solo il tipo AnyObject. Quale sarebbe il modo migliore per farlo? Specialmente per l'array, devo essere in grado di dire dinamicamente che l'array contiene il tipo di Employee.

risposta

12

Non è necessario ereditare da NSObject (a meno che non si dispone di un buon motivo per).

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))") 
} 

uscita

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

Questo funziona anche con Structs

+1

Questo è esattamente quello che stavo cercando! –

+1

property.value.dynamicType restituisce nil se il valore è nil – shahid610169

+0

Grazie mille così tanto così –

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

Se si eredita da NSObject, è possibile utilizzare alcuni dei metodi forniti dal NSCoding e l'Objective-C runtime:

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