2016-12-03 60 views
2

使用Alamofire我們試圖確定是否錯誤是某種作爲一個「嵌套」 AFError枚舉表示的錯誤(響應代碼499)的:斯威夫特枚舉評價

if response.result.isFailure { 
     if let aferror = error as? AFError { 
      //THIS LINE FAILS 
      if (aferror == AFError.responseValidationFailed(reason: AFError.ResponseValidationFailureReason.unacceptableStatusCode(code: 499))) { 
       .... 
      } 
     }    
    } 

但是,這導致編譯器錯誤:

Binary operator '==' cannot be applied to two 'AFError' operands

你怎麼能這樣做?

回答

1

那麼,你可以嘗試擴大AFEError符合Equatable爲了使用==,但你可能使用switch和模式匹配更好:

switch aferror { 
    case .responseValidationFailed(let reason) : 
     switch reason { 
      case AFError.ResponseValidationFailureReason.unacceptableStatusCode(let code): 
       if code == 499 { print("do something here") } 
      default: 
       print("You should handle all inner cases") 
     { 
    default: 
     print("Handle other AFError cases") 
} 

這是最好的語法,以確保(並獲得編譯器可以幫助您確保)處理所有可能的錯誤情況和原因。如果你只是想在你的榜樣,以解決一個案例一樣,你可以使用新if case語法,就像這樣:

if case .responseValidationFailed(let reason) = aferror, case AFError.ResponseValidationFailureReason.unacceptableStatusCode(let code) = reason, code == 499 { 
    print("Your code for this case here") 
} 
0

正如我指出的here,你不能,默認情況下,適用平等(== )運算符在作爲關聯值的枚舉的情況下(在其案例的的任何之間);但還有很多其他方法可以確定這是否是所需的情況(並且,如果存在相關的值,則可以瞭解相關聯的值可能是多少)。

+0

如果使枚舉類型符合「Equatable」,則可以應用'=='枚舉具有關聯值的情況。你只是不要免費獲得它。 –

+1

好吧;我將補充一點。另請參閱我在這個問題上的bug報告:https://bugs.swift.org/browse/SR-2900 - 正如喬丹羅斯所說,Swift未能「綜合Equatable」,這是一個更多一般投訴。 – matt

+0

對於Swift,+1會自動將枚舉與相關的Equatable類型相符/合成,以便自己進行Equatable!也許在Swift 4中... –