【问题标题】:Nonfailable enum initializer with default value具有默认值的非失败枚举初始化器
【发布时间】:2015-06-04 02:31:46
【问题描述】:

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

【问题讨论】:

  • 你不能直接覆盖带有rawValue 参数的init 吗?还有return super.init(rawValue: rawValue) ?? yourDefaultValue?
  • ...但是如果值可能是意外的,enum 可能是错误的途径...或者失败可能是您想要的...

标签: swift enums


【解决方案1】:

你的意思是这样的?

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 文档所说:

注意

原始值初始化器是一个可失败初始化器,因为不是每个 原始值将返回一个枚举成员。有关详细信息,请参阅 可失败的初始化器。

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

【讨论】:

  • 是的,期望 nil 值可能更好,但为了方便起见,我选择了您的解决方案
猜你喜欢
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多