【问题标题】:Delegate a non-failable initializer to a failable initializer将不可失败的初始化器委托给可失败的初始化器
【发布时间】:2015-04-16 07:50:31
【问题描述】:

编辑

感谢@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
}

【问题讨论】:

    标签: swift enums initializer


    【解决方案1】:

    虽然您不能委托给可失败初始化程序,但由于枚举是值类型,您可以尝试使用可失败初始化程序创建同一枚举的另一个值,然后在 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
    

    【讨论】:

    • 谢谢!我很尴尬,我没想到在初始化程序中使用类型名称。
    • 哈!我坚持通过尝试self.init(.... ..no way 来使其工作。当我看到解决方案只是 self = 等时,我感到很奇怪 :-) 谢谢。
    • 如果其他人试图创建一个委托给可失败初始化程序但在失败时停止执行的初始化程序(例如 preconditionFailure()),则以下工作:init(unsafeValue: Int) { guard let result = Result(rawValue: unsafeValue) else { preconditionFailure("Unsafe value was not a valid result") } self = result }
    • 如果您需要在 self = 不可用的课程上执行此类操作,请参阅 stackoverflow.com/questions/67781425/…
    猜你喜欢
    • 2016-07-03
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多