Swift で列挙子を文字列に変換する

Swift プログラミング

Swift 2.0 から、列挙子を文字列に簡単に変換できるようになりました。

その方法を紹介します。


Swift 2.0 から、列挙型の列挙子を文字列に変換できるようになりました。

方法は簡単で、列挙子を String型 の変換イニシャライザに渡すだけで実現できます。直接渡しても、変数に入れて渡しても同じです。

let string = String(MyEnum.Scene1)

このようにすることで、たとえばこの MyEnum 列挙型が MyApp モジュールで定義されていたとすると、次のような文字列で取得できます。

MyApp.MyEnum.Scene1

所属するアプリなどのモジュール名も併せて取得されることになるところに注意が必要、かもしれません。

ただ、ソースコードを別の場所にコピーして使うとかでなければ、通常は名前が変わることはなさそうです。それに文字列化できると言っても、同値判定などの処理は列挙子でやるでしょうし、文字列化した後でそれを使って細かい処理をする機会はないように思います。

そうなると使い道はデバッグやログへの出力くらいでしょうから、もしも名前が変わったとしても問題になることはなさそうです。そもそも名前空間も含めて 1 つの名前ですから、むしろそれを勝手に取り除かれてしまったら、たまたま同じ名前だったときに判断できなくなってしまうので、よく考えるとこの変換が妥当でした。

値付き列挙型の文字列化

値付き列挙型も文字列化できます。

文字列への変換にもいろいろ事情があるみたいで、必ずしもスマートなルールで名前が付けられるわけではないようですけど、少なくとも名前がかぶるようなことがないように工夫されている様子でした。

ただ、たとえばケースによって様々な型をとる列挙型の場合のようなときに、文字列化がうまく行えない場合があるようなので、過信は禁物かもしれません。

ジェネリックな値付き列挙型の文字列化

ジェネリックに型を取る値付き列挙型も文字列に変換できる様子でした。

文字列への変換にもいろいろ事情があるみたいで、必ずしもスマートなルールで名前が付けられるわけではないようですけど、原則的にはちゃんとそれぞれが別々の文字列に変換される様子でした。

ただ、扱う型が CustomStringConvertible プロトコルに準拠しているような場合だと、場合によっては違う列挙子で同じ文字列が生成されることもあるようなので、やはりこちらも参考程度に利用するのが無難のようです。

まとめ

以上のように、いろんな列挙型を普通に文字列化できるようになっていました。

ただし不安定に見えるところがあったり、変換ルールが列挙子によって不規則だったりするようなので、これに頼って何かプログラム的な処理をするなどは避けたほうが賢明かもしれません。

そもそも列挙子を使って処理を行うのが列挙型の役割なので、わざわざ文字列化して処理をしなければならないような場面は避けるべきとも言えます。文字列化して使う状況であれば、今回の方法に頼るのではなく、ちゃんと変換関数を自分で列挙型に実装するのが正しい在り方と言えそうです。