LoginSignup
4
4

More than 3 years have passed since last update.

[Swift] enumにイニシャライザを宣言すると、例えば文字列の列挙を型安全に扱える

Last updated at Posted at 2019-06-15

前提環境

  • Xcode 10.1
  • Swift 4.2

enumのTipsです。
想定ケースとしては、APIのレスポンスで、列挙値が文字列として返却されてくる、とか。

例えば、
"company"というkeyのvalueは、

  • "google"
  • "apple"
  • "facebook"
  • "amazon"

の何れかが入っている、とします。
このコードのように、文字列リテラルで判定するのは「型安全」ではありません。

if company == "google" {
    print("google")
} else if company == "apple" {
    print("apple")
} else if company == "facebook" {
    print("facebook")
} else if company == "amazon" {
    print("amazon")    
}    

そこで、こんなenumの使い方のご提案。
イニシャライザがポイントになります。

playground
import Foundation

enum Company: String {
    case google
    case apple
    case facebook
    case amazon

    init(_ value: String) {
        guard let company = Company(rawValue: value) else {
            preconditionFailure("Company is undefined.")
        }
        self = company
    }
}

// APIのレスポンス文字列をenumに変換する想定
let company = Company("apple")

switch company {
case .google:
    print("google")
case .apple:
    print("apple")
case .facebook:
    print("facebook")
case .amazon:
    print("amazon")
}

メリット

  • enumの言語仕様によって網羅性のチェックが行われますので、列挙値が増えた際に修正漏れを防げます。
  • 想定外の値が入ってきた場合のチェックロジックを集約でき、防衛的プログラミングが可能です。
  • Xcodeの機能にて一括リネームが可能ですので、リファクタリングしやすいです。
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4