[Swift] リフレクションを利用してEnumのcase名を文字列として利用する方法

*Swift2によるコードです。

SortConditionというソート条件の列挙型を考えます。ソートに使うプロパティと昇降順の情報を持たせたいので以下のようになります。

enum SortCondition {
case Name(Bool)
case Date(Bool)
}

let condition = SortCondition.Name(true)
switch condition {
case .Name(let ascending):
collection.sort(property: "name", ascending: ascending)
case .Date(let ascending):
collection.sort(property: "date", ascending: ascending)
}

“name”や”date”という情報はenum内で判断させることも出来ますが、結局switch等で値を決定する必要があることには違いありません。ですのでcaseが増えるとそのつどswitchを更新する必要があります。

そこでcase名を文字列として取得してプロパティの値に利用できれば、caseを増やしてもswitchをメンテナンスする必要がなくなります。やってみましょう。

enum SortCondition {
case name(Bool)
case date(Bool)

var property: String {
let mirror = Mirror(reflecting: self)
return mirror.children.first?.0 ?? ""
}

var ascending: Bool {
let mirror = Mirror(reflecting: self)
return (mirror.children.first?.1 as? Bool) ?? true
}
}

let condition = SortCondition.name(true)
collection.sort(property: condition.property, ascending: condition.ascending)

リフレクションを使いenumの情報を取得して利用しています。Mirrorはクラス・構造体・列挙型の情報をあらわすリフレクションのための構造体です。このようにMirrorを利用するとcase名や関連値を取得することができるので、case名を文字列として利用することができます。(case名は小文字からはじまっていますが、頭文字を大文字にしておいて小文字に変換しても良いかもしれません。)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です