带有默认值的不可失败枚举初始化器。

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

1
你不能只是覆盖那个带有“rawValue”参数的“init”吗?然后返回“super.init(rawValue: rawValue) ?? yourDefaultValue”? - nhgrif
...但如果值可能是意外的,那么“枚举”可能不是正确的选择...或者失败可能是你想要的... - nhgrif
1个回答

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)

这里有另一种变化:
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)

因为正如苹果文档所述:

注意

原始值初始化器是一个可失败的初始化器,因为不是每个原始值都会返回一个枚举成员。有关更多信息,请参见可失败的初始化器。

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


1
是的,预计空值可能更好,但出于方便起见,我选择了您的解决方案。 - Morrowless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接