ドキュメントにないメソッドreflect
を使えば、Swiftで一応リフレクションが使えるようなので使ってみました。
なお、ドキュメントには載っていない情報なので、今後変更されたり、なくなったりする可能性があります。
前提
次のようなクラスとインスタンスがあったとします。
1 2 3 4 5 6 7 8 9 10 11 12 | struct Foo { let num = 3 let str = "Hoge" } class Bar { let num = 3.14 let str = "Fuga" let foo = Foo() } let x = Bar() |
reflect
reflect
を使うと識別子名や値などを見ることができます。
1 2 3 4 5 6 7 8 | var ref = reflect(x) for var i = 0 ; i < ref.count; ++i { let key : String = ref[i]. 0 let summary : String = ref[i]. 1 .summary let value : Any = ref[i]. 1 .value let valueType: Any.Type = ref[i]. 1 .valueType println( "\(key) = \(value) \(valueType) \(summary)" ) } |
出力結果は次の通り。値の参照はできますが、代入はできないっぽいです。
1 2 3 | num = 3.14 (ExistentialMetatype) 3.14 str = Fuga (ExistentialMetatype) Fuga foo = SampleApp.Foo (ExistentialMetatype) SampleApp.Foo |
デバッガで見ると_ClassMirror
という謎クラスが取れます。
dump
ちなみにドキュメントにないメソッドとしてdump
もあり、dump(x)
で次のような出力を出します。
1 2 3 4 5 6 | ▿ SampleApp.Bar # 0 - num: 3.14 - str: Fuga ▿ foo: SampleApp.Foo - num: 3 - str: Hoge |
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。