2015-06-04 58 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