具有默认值的Nonfailable枚举初始值设定项

时间:2015-06-04 02:31:47

标签: swift enums

有没有办法定义枚举,从rawValue初始化时默认为某个值而不是失败?在值可能意外(即服务器API错误)的情况下很有用

1 个答案:

答案 0 :(得分: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)

因为正如Apple doc所说的那样:

  

请注意

     

原始值初始化程序是一个可用的初始化程序,因为不是每个   原始值将返回枚举成员。有关更多信息,请参阅   可用的初始化器。

但一般来说,如果你想使用带有rawvalue的枚举,你应该期望一个可选的,并将nil返回值视为枚举定义之外的默认错误情况。那是我的建议。