2017-05-21 11 views
2

caseに関連付けられた値がある場合、列挙型の等価性はどのようにテストできますか?不自然な例:あなたはif caseを使用することができますfor ...等価のための列挙型のテスト列

enum Status : Equatable { 
    case success 
    case failed(error: String) 

    static func == (lhs: Status, rhs: Status) -> Bool { 
     switch (lhs, rhs) { 
     case (.success, .success), (.failed, .failed): 
      return true 
     default: 
      return false 
     } 
    } 
} 

let statuses = [ 
    Status.success, 
    .failed(error: "error 1"), 
    .failed(error: "error 2"), 
    .success 
] 

// Failed: Binary operator '==' cannot be applied to operands of type 'Status' and '_' 
for s in statuses where s == .failed { 
    print(s) 
} 

(私はs != .successをテストすることができます知っているが、彼らは面倒ですので、実際の列挙型は、より多くの例があります)

+2

'failed 'は他のものと同じだと思うので(通常は' error'が同じであれば変わってしまいます)、s ==のステータスで 'for'を実行できます。失敗しました(エラー: ""){...} '。 'if'では' if case'を実行できます。 'if case .failed = someStatus {...}'のようになります。 – Rob

+1

プロセス内で関連する値を抽出しても構わない場合は、 'print(" failure:\(str) ")}'のように 'for case .failed(let str)を実行することができます。 – vacawama

+1

これは幾分冗談ですが、うまくいきます: '大文字小文字(状態、ステータス){print(s)}'の場合(.failed、let s) – vacawama

答えて

3

for status in statuses { 
    if case .failed = status { 
     ... 
    } 
} 

しかし、残念ながらcasewhere節のループで使用することはできません。ループはforです。あなたは関係なく、error関連付けられた値が何であったかの別に等しくなるように.failedを定義したので、ここでは


、しかし、あなたは理論的に行うことができます:

for status in statuses where status == .failed(error: "") { 
    show("\(status)") 
} 

私はクレイジーじゃありませんそのパターンについては、(a).failedの値が異なる値を持っていても値が等しいという事実を条件にしています。 (b)結果が誤解されやすいコードになります。