前提環境
- 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の機能にて一括リネームが可能ですので、リファクタリングしやすいです。