默认初始化程序是failable。这意味着如果接收到的参数与有效的枚举大小写不匹配,它会返回nil。
现在你想做两件不相容的事情:
- 您希望重新定义默认初始化程序,使其不会失败。实际上,您希望在接收到的参数无效时创建一个默认枚举值。
- 在您重新定义的初始化程序中,您希望使用与新初始化程序相同的名称调用可失败初始化程序(不再存在)。
这是不可能的,我有以下3种可能的解决方案:
- 创建不同的初始化
你定义了一个新的不可失败初始化器,它有一个默认值,一个不同的参数名,在里面你调用默认的可失败初始化器。
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