代替可失败的初始值设定项,您可以将它 return 设为默认情况吗?

In place of a failable initializer, can you instead have it return a default case?

考虑这个枚举...

enum ServiceValue : String, Decodable {
    case a
    case b
    case c
    case other
}

给定一个字符串 'a' 你可以获得枚举的一个实例,如下所示:

// 'value' is an optional since the initializer is bailable
let value = ServiceValue(rawValue:'a')

我们想要做的是 returning 'nil' 用于 'd' 或 'somethingUnknown' 等未知值,我们想要 return ServiceValue.other。但是,您不能覆盖初始化程序,因为它不在基础 class 中,而是编译器为此枚举本身生成的。

就是说,我们尝试自己滚动,就像这样...

init(serviceValue:String){
    self.init(rawValue:serviceValue) ?? self.init(rawValue:"other")
}

...但这并没有解决以下错误:

A non-failable initializer cannot delegate to failable initializer 'init(rawValue:)' written with 'init?'

Initializer delegation ('self.init') cannot be nested in another expression

当然我可以简单地写一个静态方法initFrom,像这样...

initFrom(serviceValue:String) -> ServiceValue {
    return ServiceValue(rawValue:serviceValue) ?? ServiceValue(rawValue:"other")
}

...但这是一个工厂方法,不是真正的初始化器,它也不能防止有人仍在使用 init(rawValue:(尽管最后一部分可能很好,因为它会改变预期的行为。在完美世界,我会完全隐藏那个初始化器,但同样,你不能在枚举中覆盖初始化器。)

那么这可以实现吗,还是工厂模式是唯一的出路?

您可以创建具有默认值的自定义非易错初始化器,如下所示:

init(string: String) { 
    self = ServiceValue(rawValue: string) ?? .other
}