swift - 将不可失败的初始化器委托(delegate)给可失败的初始化器

标签 swift enums 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 并返回 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
}

最佳答案

虽然你不能委托(delegate)给一个可失败的初始化器,因为枚举是值类型,你可以尝试使用可失败的初始化器创建相同枚举的另一个值,然后在 nil 的情况下替换默认值。 , 并将其分配给 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

关于swift - 将不可失败的初始化器委托(delegate)给可失败的初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29656255/

相关文章:

iOS Swift - 是否可以直接从 PHP 使用 FCM 发送通知?

java - 在类外部声明的枚举

spring-boot - 如何在 Spring 中将 WWW 表单字段反序列化为枚举?

java - 静态初始化器与实例初始化器与构造函数

c++ - 如何在 C++ 类的初始化列表中初始化成员结构?

xcode - 我无法在 ViewController.swift 中链接 IBOutlets

ios - 无法使用 NSKeyedArchiver 保存我的模型

c++ - 将字符串解析为不区分大小写的 protobuf 枚举

c# - 声明一个列表并使用一个代码语句填充值

ios - 在 ARKit session 中左右移动对象