swift - 代替可失败的初始化器,你可以让它返回一个默认情况吗?

标签 swift enums swift4 failable

考虑这个枚举...

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')

我们想要做的不是为未知值(如“d”或“somethingUnknown”)返回“nil”,而是返回 ServiceValue.other。但是,您不能覆盖初始化器,因为它不在基类中,而是编译器为此枚举本身生成的。

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

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
}

关于swift - 代替可失败的初始化器,你可以让它返回一个默认情况吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49883389/

相关文章:

arrays - 在 View Controller 之间传递数组数据

ios - 如何将多个 ImageView 分组以拥有 1 个滑动手势识别器? iOS swift

iOS Swift 无法关闭 avplayer 模式

java - 返回正确的枚举而不使用 if

ios - 从继承类访问父类(super class)属性

macos - 如何在 OS X 中创建自定义工具栏?

javascript - .Net javascript 共享枚举

c++ - 程序使用 clang++ 编译,但 g++ 耗尽 RAM 并失败

swift - 删除数据和缓存 wkwebview swift 4

ios - -[_ SwiftValue integerValue]:无法识别的选择器发送到实例0x60000044d560使用Google Mobile Vision时出错