Swift — вложенные перечисления — как выполнить одно и то же действие для всех вложенных перечислений со связанными значениями?

#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