2015-06-04 89 views
4

有沒有辦法定義一個枚舉,當從rawValue初始化將默認爲一些值而不是失敗?在值可能意外(即服務器API錯誤)的情況下很有用默認值非破壞枚舉初始值設定項

+1

難道你不能只重寫那個需要'rawValue'參數的'init'嗎?並且返回super.init(rawValue:rawValue)?? yourDefaultValue'? – nhgrif

+0

...但是如果這個值可能是意想不到的,那麼'enum'可能是錯誤的途徑......或者失敗可能是你想要的...... – nhgrif

回答

4

你的意思是這樣的嗎?

enum ErrorCode: Int { 
    case NoErr = 0, Err1, Err2, LastErr, DefaultErr 

    init(value: Int) { 
     if (value > LastErr.rawValue) { 
      self = .DefaultErr 
     } else { 
      self = ErrorCode(rawValue: value)! 
     } 
    } 
} 

let error: ErrorCode = .LastErr 
let anotherError: ErrorCode = ErrorCode(value: 99) 

這裏是另一種變化:

enum ErrorCode: Int { 
    case NoErr = 0, Err1, Err2, LastErr 

    init?(value: Int) { 
     if (value > 3) { 
      return nil 
     } else { 
      self = ErrorCode(rawValue: value)! 
     } 

    } 
} 

let error: ErrorCode = .LastErr 
let anotherError: ErrorCode? = ErrorCode(value: 99) 

這相當於:

enum ErrorCode: Int { 
    case NoErr = 0, Err1, Err2, LastErr 
} 

let anotherError: ErrorCode? = ErrorCode(rawValue: 99) 

因爲蘋果DOC是指出:

注意

原始值初始值設定項是一個failable初始值設定項,因爲不是每個 原始值都會返回一個枚舉成員。有關更多信息,請參閱 Failable初始化程序。

但是一般來說,如果你想使用enum和rawvalue,你應該期待一個可選的並且把nil返回的值作爲enum定義之外的默認錯誤情況。這將是我的建議。

+1

是的,它可能更好地期望零值,但我選擇爲了方便起見,您的解決方案 – Morrowless