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