概要
String型からEnumに変換してプロジェクト内で使うシーンは多々ありますよね
簡単かつ雑にまとめておきます
変換方法
以下のドキュメントにあるRawRepresentable
プロトコルのイニシャライザを使う。
もう本当にそれだけです笑
実際に使ってみると以下のようになります。
// ※String型のRawRepresentableに準拠させる
enum Fruit: String {
case apple
case banana
case orange
}
let fruit = Fruit(rawValue: "apple") // ここでrawValueからEnumインスタンス生成
print(fruit) // Optional(Fruit.apple)
// enumなので分岐も網羅できて良き
if let fruit {
switch fruit {
case .apple, .orange:
print("This is an " + fruit.rawValue)
case .banana:
print("This is a " + fruit.rawValue)
}
}
このような感じで、Enumのイニシャライザ引数であるrawValueに変換したい文字列を渡してあげることで、Enumのインスタンスが生成されます。
ポイント
- 変換先のEnumはString型を割り当てる
-
init(rawValue:)
イニシャライザの引数に変換したい文字列を指定
case名と異なる文字列をEnumに変換することも可能です。
// 対応する文字列を各caseに割り当てる
enum Fruit: String {
case apple = "リンゴ"
case banana = "バナナ"
case orange = "オレンジ"
}
let fruit = Fruit(rawValue: "オレンジ")
print(fruit) // Optional(Fruit.orange)
注意点
生成されたインスタンスは、Optional型で、対応するcaseがない場合はnilを返します。
以下をご覧ください。
enum Fruit: String {
case apple
case banana
case orange
}
let fruit = Fruit(rawValue: "peach")
print(fruit) // nil
このようにcaseに定義していない文字列から生成した場合nilになりますので、
アンラップするなり、nilの場合の処理を追加するなりして使用しましょう。
ちなみに
今回Stringからの変換で紹介しましたが、init(rawValue:)のイニシャライザはRawRepresentable
プロトコルに準拠していれば使用ができます。
そのため、Int, Float, Doubleなどでも使用できます。
enum Temperature: Double {
case cold = -10.5
case warm = 20.0
case hot = 35.5
}
let temp = Temperature(rawValue: 20.0)
print(temp) // Optional(Temperature.warm)
おわりに
かなり簡単に変換ができましたね。
個人的にはAPIレスポンスで受け取った文字列から、モバイル側でEnum管理するパターンがかなり多いためよく使用します。
(なのにあってるっけ...ってなるのでまとめました)
覚えておきましょう!