代替可失败的初始值设定项,您可以将它 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
}
考虑这个枚举...
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
}