[解決済み] Swiftでenumの関連値を無視して比較する方法は?
質問
読後感 関連する値を持つSwiftの列挙型の等質性をテストする方法 を読んで、以下のような列挙型を実装してみました。
enum CardRank {
case Number(Int)
case Jack
case Queen
case King
case Ace
}
func ==(a: CardRank, b: CardRank) -> Bool {
switch (a, b) {
case (.Number(let a), .Number(let b)) where a == b: return true
case (.Jack, .Jack): return true
case (.Queen, .Queen): return true
case (.King, .King): return true
case (.Ace, .Ace): return true
default: return false
}
}
次のコードは動作します。
let card: CardRank = CardRank.Jack
if card == CardRank.Jack {
print("You played a jack!")
} else if card == CardRank.Number(2) {
print("A two cannot be played at this time.")
}
しかし、これではコンパイルできません。
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
...すると、次のようなエラーメッセージが表示されます。
二項演算子 '==' は 'CardRank' 型のオペランドと '(Int) -> CardRank' 型のオペランドに適用することはできません。
これは完全な型を期待しているからだと思うのですが、そして
CardRank.Number
は型全体を指定しないのに対し
CardRank.Number(2)
がそうであったのに対して。しかし、この場合、私はそれが
にも
番号にマッチさせたいのです。
もちろんswitchステートメントを使うことも出来ますが、このように
==
演算子を実装したのは、この冗長な解決策を回避するためです。
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
enumの関連値を無視して、関連値と比較する方法はありますか?
注意してください。
の大文字と小文字を変更できることに気づきました。
==
メソッドを
case (.Number, .Number): return true
というメソッドがありますが、これは正しく真を返しますが、私の比較はまだ特定の数字と比較されているように見えます (
number == CardRank.Number(2)
ここで 2 はダミー値です)ではなく
任意
の数でなく (
number == CardRank.Number
).
どのように解決するのですか?
編集してください。
Etan が指摘するように
(_)
のワイルドカードマッチを省略することができます。
残念ながら、私はあなたの
switch
のアプローチよりも簡単な方法はないと思います。
しかし、Swift 2 では、新しい
if-case
のパターンマッチを使うことができます。
let number = CardRank.Number(5)
if case .Number(_) = number {
// Is a number
} else {
// Something else
}
冗長性を避けたいのであれば、冗長性をなくすために
isNumber
を追加して、switch ステートメントを実装することができます。
関連
-
Swift Error fatal error: Optional value のアンラップ中に予期せず nil を発見した。
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] Bashで、文字列がある値で始まっているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Swiftでindexとelementでループを反復させる方法
-
[解決済み] String型のenumを列挙する方法は?
-
[解決済み] タスクが終了するまで待機する
-
[解決済み] Swiftでbutton.addTargetアクションにパラメータを付ける
-
[解決済み] ""内の二重引用符を印刷するには?
-
[解決済み] Swift - 複数条件でオブジェクトの配列を並べ替える
-
[解決済み] ボタンを無効化する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Swiftの列挙型と関連する値の等質性をテストする方法
-
[解決済み] Swiftで1つのビューコントローラの向きを縦向きのみに固定する方法
-
[解決済み] Protocol ... can only be used as generic constraint because it has Self or associated type requirements "とは、どういう意味ですか?
-
[解決済み] Swift 3でカスタム通知を作成するには?
-
[解決済み] Swiftで警告を消すには?
-
[解決済み] Swiftスクリプトでターミナルコマンドを実行するには?(例:xcodebuild)
-
[解決済み] 小数点以下2桁に切り上げ
-
[解決済み] Swift で UIViewController のサブクラス用のカスタムイニシャライザを作るには?
-
[解決済み] Swiftの変数に"?"(クエスチョンマーク)と"!"(エクスクラメーションマーク)の装飾を施す。
-
[解決済み] SwiftUIのForEachでインデックスを取得する