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

Mor*_*ess 5 enums swift

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

Lau*_*ent 5

你的意思是这样的吗?

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)
Run Code Online (Sandbox Code Playgroud)

这是另一种变体:

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)
Run Code Online (Sandbox Code Playgroud)

这相当于:

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

let anotherError: ErrorCode? = ErrorCode(rawValue: 99)
Run Code Online (Sandbox Code Playgroud)

因为正如苹果文档所说:

笔记

原始值初始值设定项是一个可失败的初始值设定项,因为并非每个原始值都会返回枚举成员。有关详细信息,请参阅可失败的初始化程序。

但一般来说,如果您想将枚举与原始值一起使用,则应该期待一个可选值,并将 nil 返回值视为枚举定义之外的默认错误情况。这就是我的建议。