将不可失败的初始化器委托给可失败的初始化器
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
编辑
感谢@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