こちらの記事を参考にMirrorオブジェクトを使ってみました。
プロパティー名一覧の取得
以下でプロパティー名一覧を取得できました。
しかしComputedPropertyは取得できないようです。
class MyClass { var prop1 = 0 var prop2: Int { return 0 } func method() {} } let mirror = Mirror(reflecting: MyClass()) print(mirror.children.flatMap { $0.label }) // ["prop1"]
親クラスの情報を取得
サブクラスのミラーには親クラスのプロパティー情報は入っていません。
class MyClass { var prop1 = 0 var prop2: Int { return 0 } func method() {} } class SubClass: MyClass { } let mirror = Mirror(reflecting: SubClass()) print(mirror.children.flatMap { $0.label }) // []
superclassMirrorを使う事で親クラスの情報を取得できます。
let mirror = Mirror(reflecting: SubClass()) print(mirror.superclassMirror()?.children.flatMap { $0.label }) // Optional(["prop1"])
クラス名を取得する
subjectTypeを使うとクラス名を取得できます。
let mirror = Mirror(reflecting: SubClass()) print(mirror.subjectType)
インスタンスのタイプを取得する
displayStyleを使うとインスタンスがクラス/構造体などのどれに該当するかを取得できます。
let mirror = Mirror(reflecting: SubClass()) print(mirror.displayStyle) // Optional(Swift.Mirror.DisplayStyle.Class)
種類は以下のどれかです。
public enum DisplayStyle { case Struct case Class case Enum case Tuple case Optional case Collection case Dictionary case Set }