2016-07-15 9 views
5

それでは、私はこのようなクラスを持っているとしましょう:すばやく(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の場合はnilを返します – shahid610169

+0

ありがとうございますso so so much –

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 
関連する問題