しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Mirrorオブジェクトを使ってみる

こちらの記事を参考にMirrorオブジェクトを使ってみました。

Swift reflectionについて - Qiita

プロパティー名一覧の取得

以下でプロパティー名一覧を取得できました。
しかし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
}