事象
とある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")
}
![Screen Shot 2016-12-30 at 12.35.15.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F2569%2F5cc3dc96-7b57-6896-86f1-f19d1853f72a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=85eca7befed675ae89c09f03a145001a)
原因
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/
サンプルもこちらから拝借しています。