如果 rawValue init 将返回 nil,我想在 Swift 中为我的枚举从 rawValue 初始化以返回默认值。 现在我有这样的东西:
public init(fromRawValue: String){
self = Language(rawValue: fromRawValue) ?? .English
}
我不喜欢这个,因为它是全新的初始化程序。 我试着做这样的事情:
public init(rawValue: String){
self = Language(rawValue: fromRawValue) ?? .English
}
但是我遇到了访问错误的运行时异常。我能否以某种方式让它工作,或者我只需要使用这个新的,我不能覆盖原来的不是可选的?
我想知道是否可以从 rawValue 覆盖原始初始化而不是使用使用可失败初始化的全新初始化。
最佳答案
默认初始化器是failable
。这意味着如果接收到的参数与有效的枚举大小写不匹配,它会返回 nil
。
现在你想做两件不兼容的事:
- 您想重新定义默认初始化程序,使其不可失败。事实上,您希望在接收到的参数无效时创建一个默认枚举值。
- 在重新定义的初始化程序中,您想使用与新初始化程序相同的名称调用可失败初始化程序(不再存在)。
这是不可能的,我有以下3种可能的解决方案:
- 创建一个不同的 init
您使用默认值、不同的参数名称定义一个新的不可失败构造器,并在其中调用默认可失败构造器。
enum Language: String {
case english = "English", italian = "Italian", french = "French"
init(fromRawValue: String) {
self = Language(rawValue: fromRawValue) ?? .english
}
}
- 重新定义默认初始化
您重新定义了默认初始化程序,使其不可失败,并在其中编写了完整的逻辑。
enum Language: String {
case english = "English", italian = "Italian", french = "French"
init(rawValue: String) {
switch rawValue {
case "Italian": self = .italian
case "French": self = .french
default: self = .english
}
}
}
- 创建静态函数
enum Language: String {
case english = "English", italian = "Italian", french = "French"
static func build(rawValue: String) -> Language {
return Language(rawValue: rawValue) ?? .english
}
}
现在你可以构建一个Language
值写入:
let italian = Language.build(rawValue: "Italian") // Italian
let defaultValue = Language.build(rawValue: "Wrong input") // English
关于ios - 重写枚举初始化?(rawValue : String) to not be optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35119647/