Ответ 1
Вы хотите добавить свойство ко всем перечислениям, чье необработанное значение является строкой? Это звучит как случай для ограниченных расширений протокола!
extension RawRepresentable where RawValue == String {
var description: String {
return rawValue
}
}
Это работает, потому что все перечисления с необработанным значением автоматически соответствуют протоколу RawRepresentable
, а указанный протокол имеет связанный тип RawValue
, который сообщает вам, какой тип имеет значение raw.
Теперь ваше перечисление Animals
автоматически наследует его:
print(Animals.descCat.description) // -> "I has attitude"
Обратите внимание, что перечисления строк уже являются CustomStringConvertible
, поэтому у них уже есть свойство description
(которое возвращает имя случая перечисления), а ваш не отменяет его:
print(Animals.descCat) // -> "descCat"
Если вы хотите, чтобы ваш description
переопределял значение по умолчанию, просто добавьте объявление соответствия CustomStringConvertible
вашему перечислению:
private enum Animals: String, CustomStringConvertible { /*...*/ }
print(Animals.descCat) // -> "I has attitude"
Вы также можете расширить эту идею, чтобы охватить другие типы необработанных значений. Например:
extension RawRepresentable where RawValue: CustomStringConvertible {
var description: String {
return rawValue.description
}
}
Теперь вы можете получить автоматическое описание для перечислений, чье необработанное значение Int
или даже настраиваемый тип (если этот тип имеет собственный description
).