4
有沒有辦法定義一個枚舉,當從rawValue
初始化將默認爲一些值而不是失敗?在值可能意外(即服務器API錯誤)的情況下很有用默認值非破壞枚舉初始值設定項
有沒有辦法定義一個枚舉,當從rawValue
初始化將默認爲一些值而不是失敗?在值可能意外(即服務器API錯誤)的情況下很有用默認值非破壞枚舉初始值設定項
你的意思是這樣的嗎?
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定義之外的默認錯誤情況。這將是我的建議。
是的,它可能更好地期望零值,但我選擇爲了方便起見,您的解決方案 – Morrowless
難道你不能只重寫那個需要'rawValue'參數的'init'嗎?並且返回super.init(rawValue:rawValue)?? yourDefaultValue'? – nhgrif
...但是如果這個值可能是意想不到的,那麼'enum'可能是錯誤的途徑......或者失敗可能是你想要的...... – nhgrif