Ответ 1
Инициализатор по умолчанию failable
. Это означает, что если полученный параметр не соответствует действительному регистру enum, он возвращает nil
.
Теперь вы хотите сделать 2 несовместимых вещи:
- Вы хотите переопределить инициализатор по умолчанию, что делает его невозможным. Infact вы хотите, чтобы значение enum по умолчанию было создано, когда полученный параметр недействителен.
- Внутри переопределенного инициализатора вы хотите вызвать инициализатор с ошибкой (который больше не существует) с использованием того же имени нового.
Это невозможно, я 3 возможных решения:
1) Создание другого init
Вы определяете новый инициализатор с неисполнением со значением по умолчанию, другое имя параметра и внутри него вы вызываете инициализатор по умолчанию.
enum Language: String {
case english = "English", italian = "Italian", french = "French"
init(fromRawValue: String){
self = Language(rawValue: fromRawValue) ?? .english
}
}
2) Переопределение init по умолчанию
Вы переопределяете инициализатор по умолчанию, вы делаете его невоспроизводимым, и вы пишете полную логику внутри него.
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
}
}
}
3) Создание статической функции
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