将不可失败的初始化器委托给可失败的初始化器

Delegate a non-failable initializer to a failable initializer

编辑

感谢@Airspeed Velocity,找到了一个简单的解决方案,添加了一点扭曲,因为这是从 JSON 解析的。允许初始化器采用 AnyObject? 并默认为 Unknown(或 Invalid):

init(value: AnyObject?) {
  if let value = value as? Int
    ,let result = Result(rawValue: value) {
      self = result
  } else {
    self = .Unknown
  }
}

//

原创

我用 Unknown 案例实现了一个枚举:

enum Result: Int {
  case Success
  case Failure
  case Foo
  case Bar
  case FooBar
  case FooFoo
  ...
  case Unknown = -1
}

我想创建另一个接受 Int 和 returns Unknown 的初始化器,用于枚举无法识别的情况:

init(value: Int) {
  self.init(rawValue: value)
  if self == nil { // Complication Error
    self = .Unknown
  }
}

我现在的解决方案是工厂方法,但是初始化程序会更简洁:

static func resultWithValue(value: Int) -> Result {
  if let result = self(rawValue: value) {
    return result
  }
  return .Unknown
}

虽然你不能委托给可失败的初始化器,因为枚举是值类型,你可以尝试使用可失败的初始化器创建相同枚举的另一个值,然后在 [=11= 的情况下替换默认值],并将其分配给 self:

enum Result: Int {
    case Success
    case Failure
    case Unknown = -1

    init(value: Int) {
        self = Result(rawValue: value) ?? .Unknown
    }
}

Result(value: 100) == .Unknown  // returns true