Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将不可故障初始值设定项委托给可故障初始值设定项_Swift_Enums_Initializer - Fatal编程技术网

Swift 将不可故障初始值设定项委托给可故障初始值设定项

Swift 将不可故障初始值设定项委托给可故障初始值设定项,swift,enums,initializer,Swift,Enums,Initializer,编辑 由于@Airspeed Velocity,我们找到了一个简单的解决方案,并添加了一些扭曲,因为这是从JSON解析的。允许初始值设定项获取AnyObject?,并默认为Unknown(或Invalid): // 原创 我实现了一个带有未知案例的枚举: enum Result: Int { case Success case Failure case Foo case Bar case FooBar case FooFoo ... case Unknown =

编辑

由于@Airspeed Velocity,我们找到了一个简单的解决方案,并添加了一些扭曲,因为这是从JSON解析的。允许初始值设定项获取
AnyObject?
,并默认为
Unknown
(或
Invalid
):

//

原创

我实现了一个带有
未知
案例的枚举:

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
}

虽然不能委托给故障初始值设定项,但由于枚举是值类型,您可以尝试使用故障初始值设定项创建同一枚举的另一个值,然后在
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(..
)使其工作。不可能。当我看到解决方案只是
self=
等时,我感到很奇怪:-)谢谢。如果其他任何人试图创建一个初始值设定项,该初始值设定项委托给一个失败的初始值设定项,但在失败时停止执行(例如PredicateFailure())以下工作:
init(unsafeValue:Int){guard let result=result(rawValue:unsafeValue)else{premissionfailure(“不安全的值不是有效的结果”)}self=result}
查看是否需要在
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