2017-05-21 43 views
2

如何在case具有關聯值時測試枚舉相等性?一個人爲的例子:測試枚舉for for equal for for ... where子句

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

因爲你認爲任何'失敗'等於另一個(這很奇怪;如果'error'是相同的,通常它們是相同的),你可以在s ==的狀態下執行s。失敗(錯誤:「」){...}'。請注意,使用'if',你可以做'if case',例如'如果case .failed = someStatus {...}'。 – Rob

+1

如果你不介意在過程中提取關聯的值,你可以在case {fa(let)str){print(「failure:\(str)」)}'中做。 – vacawama

+1

這在某種程度上是開玩笑的,但它確實有效:'用於在zip(狀態,狀態){print(s)}'情況下(.failed,let s)''。 – vacawama

回答

3

您可以使用if case

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

但是,不幸的是,您不能使用casefor循環的where子句。


在這種情況下,雖然,因爲你已經定義.failed等於另一無論error關聯的值是什麼,你理論上可以這樣做:

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

我沒瘋因爲(a)它取決於.failed值相等的事實,即使它們具有不同的error關聯值;和(b)它導致容易被誤解的代碼。