Posted at

SwiftのEnumをif文で比較できない(Associated Value)

More than 1 year has passed since last update.


事象

とある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

'=='は使えませんと。

使えませんと言われましても、、としばらく悩んでしまった。


原因

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/

サンプルもこちらから拝借しています。

http://stackoverflow.com/questions/31548855/how-to-compare-enum-with-associated-values-by-ignoring-its-associated-value-in-s