事象
とあるenumの値をif文で比較しようとしたら怒られました。
import Foundation
enum LoginProvider {
case facebook
case email(String, String)
case google
case twitter
}
let provider = LoginProvider.email("bob@bob.com", "pass")
if provider == .facebook {
print("facebook")
}
原因
email(String, String)
がEnumのAssociated Valueというもので、これが含まれていると==
オペレーターは使えずコンパイルエラーになってしまいます。
解決策
これに対応するには素直にswitch
文で書くか、if文で書きたければif-case
パターンマッチが使えます。
import Foundation
enum LoginProvider {
case facebook
case email(String, String)
case google
case twitter
}
let provider = LoginProvider.email("bob@bob.com", "pass")
// 単純な比較はコンパイルエラーになる❌
// Binary operator '==' cannot be applied to operands of type 'LoginProvider' and '_'
if provider == .facebook {
print("facebook")
}
// switch文で書くのが無難⭕️
switch provider {
case .facebook: break
case .email: break
case .google: break
case .twitter: break
}
// とはいえ単一の比較とかならif文で書きたいことも
// if文で書くならパターンマッチを使う⭕️
if case .facebook = provider {
print("facebook")
} else if case .email = provider {
print("email")
}
所感
エラーメッセージが==
使えませんだけなので、知らないと結構悩みそうだなぁと思いました。仕様的に使えないのはわかりましたけど、何で使えないのかまではまだ分かってないです。使えても良さそうな気がするんですけどね。
参考
EnumのAssociated Valueについてはこちらが参考になりました。
https://realm.io/jp/news/david-east-simplifying-login-swift-enums/
サンプルもこちらから拝借しています。