[解決済み】Swiftの列挙型と関連する値の等質性をテストする方法
2022-04-10 05:11:29
質問
2つのSwift enumの値が等しいかどうかをテストしたい。 例えば
enum SimpleToken {
case Name(String)
case Number(Int)
}
let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)
XCTAssert(t1 == t2)
しかし、コンパイラは等式をコンパイルしない。
error: could not find an overload for '==' that accepts the supplied arguments
XCTAssert(t1 == t2)
^~~~~~~~~~~~~~~~~~~
等号演算子のオーバーロードは自分で定義しなければならないのでしょうか? 私は、Scala と Ocaml がそうであるように、Swift コンパイラが自動的にそれを処理することを期待していました。
どのように解決するのですか?
Swift 4.1+
として
JEDWIDZ
は、Swift 4.1以降、(そのため、)
SE-0185
を合成することもサポートしています。
Equatable
と
Hashable
は、関連する値を持つ列挙型のためのものです。
Swift 4.1以降であれば、以下のように必要なメソッドが自動的に合成されます。
XCTAssert(t1 == t2)
が動作します。重要なのは
Equatable
プロトコルを列挙してください。
enum SimpleToken: Equatable {
case Name(String)
case Number(Int)
}
let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)
Swift 4.1以前
他の人が指摘したように、Swift は必要な等式演算子を自動的に合成しません。しかし、私はよりクリーンな(IMHO)実装を提案させてください。
enum SimpleToken: Equatable {
case Name(String)
case Number(Int)
}
public func ==(lhs: SimpleToken, rhs: SimpleToken) -> Bool {
switch (lhs, rhs) {
case let (.Name(a), .Name(b)),
let (.Number(a), .Number(b)):
return a == b
default:
return false
}
}
理想的な方法とは言い難いですが、少なくとも、ifステートメントを内部に含むネストされたスイッチを作る必要はありません。
関連
-
[解決済み】Thread 1: signal SIGABRTエラーを解決するには?[クローズド]
-
[解決済み] Swift 5でXOR?
-
[解決済み] swift 3 エラー。引数ラベル '(_:)' は利用可能なオーバーロードに一致しません。
-
[解決済み] 使用しているSwiftのバージョンを確認するにはどうすればよいですか?
-
[解決済み] Swift: print() vs println() vs NSLog()
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftでindexとelementでループを反復させる方法
-
[解決済み】String.substringWithRangeはどのように使うのですか?(または、SwiftでRangeはどのように動作しますか?)
-
[解決済み】iOS8でSwiftを使用して特定のViewControllerのステータスバーの色を変更する。
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] スウィフト 2: !, ?-" オプション型「...」の値がアンラップされていない"
-
[解決済み] メインスレッドチェッカー バックグラウンドスレッドで呼び出された UI API: -[UIApplication applicationState].
-
[解決済み] SwiftはPass By ValueかPass By Referenceか
-
[解決済み] Swiftの@selector()?
-
[解決済み】Swiftで変数の型またはクラスを表示するにはどうすればよいですか?
-
[解決済み】解決方法。iOS 13.0で'keyWindow'が非推奨になりました。
-
[解決済み】swift 4でenumをDecodableにするにはどうすればいいですか?
-
[解決済み】SwiftでFloatをIntに変換する。
-
[解決済み】dyld: ライブラリがロードされません。rpath/libswift_stdlib_core.dylib です。
-
[解決済み】swiftで変数のメモリアドレスを印刷する