LoginSignup
23
17

More than 5 years have passed since last update.

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

Posted at

事象

とある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/
サンプルもこちらから拝借しています。

23
17
2

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
23
17