编辑
感谢@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
}
self.init(....
来使它工作,但是不行。当我看到解决方案只是简单的self =
等时,感觉很奇怪 :-) 谢谢。 - Trevorinit(unsafeValue: Int) { guard let result = Result(rawValue: unsafeValue) else { preconditionFailure("Unsafe value was not a valid result") } self = result }
- Nicholasself =
不可用的类上执行此类操作,请参见https://stackoverflow.com/questions/67781425/use-self-in-convenience-initializers-to-delegate-to-jsondecoder-or-factory-m。 - deaton.dgself.init
这样的语法,但是你可以使用self = Self(....
来代替self = Result(....
,尽管这并不一定会使代码更清晰! - Bluby