#swift #enums #computed-properties #associated-value
#swift #перечисления #вычисляемые свойства #ассоциированное значение
Вопрос:
Я хочу распечатать исходное значение вложенных перечислений. Например, если у меня есть перечисление продуктов верхнего уровня с несколькими случаями (для простоты скажем просто два: фрукты, овощи), Каждый из которых является строковыми перечислениями (фрукты: строка, овощи: строка и т. Д.), Есть ли способ распечатать внутренние связанные значения без переключенияоператор один перечисление верхнего уровня?
Мой текущий код приведен ниже. Как вы можете видеть, чем больше обращений я добавляю в Food, тем больше избыточного кода окажется в описании var. Я хотел бы написать одно действие для всех случаев, которое выводит исходное значение внутренних перечислений.
Возможно ли это без переключателя?
enum Foods {
case fruit(Fruit)
case veggie(Vegetable)
var description: String { // this is what I'd like to replace
switch self {
case .fruit(let type):
return type.rawValue // since every case will look like this
case .veggie(let type):
return type.rawValue
}
}
}
enum Fruit: String {
case apple = "Apple"
case banana = "Banana"
}
enum Vegetable: String {
case carrot = "Carrot"
case spinach = "Spinach"
}
Ответ №1:
Возможно ли это без переключателя?
Нет, в настоящее время это невозможно.
Обходной путь: я заметил шаблон с вашими именами регистров перечислений. Исходные значения каждого из них являются заглавными версиями имени обращения i.e. case apple = "Apple"
. Если этот шаблон выполняется всегда, вы можете использовать следующий код:
var description: String { ("(self)".split(separator: ".").last?.dropLast().capitalized)! }
Что приведет к:
print(Foods.fruit(.apple).description) // Apple