Можете ли вы продлить перечисление?
Я использую перечисления для хранения строковых значений, как это:
enum Animals: String {
case descCat = "I has attitude"
case descDog = "how can I help"
case descGator = "I will eat you"
var s: String {
get {
return self.rawValue as String
}
}
}
Тогда я получаю к ним доступ так:
print("Dogs be like:" + Animals.descDog.s)
Мой вопрос заключается в том, могу ли я расширить перечисления, как любая другая структура или объект, поэтому мне не нужно добавлять var s: String {}
свойство каждого перечисления?
1 ответ
Вы хотите добавить свойство ко всем перечислениям, чье необработанное значение является строкой? Это звучит как случай ограниченных расширений протокола!
extension RawRepresentable where RawValue == String {
var description: String {
return rawValue
}
}
Это работает, потому что все перечисления с необработанным значением автоматически соответствуют RawRepresentable
протокол, и указанный протокол имеет связанный тип RawValue
это говорит вам, какой тип является необработанным значением.
Теперь ваш Animals
enum автоматически унаследует это:
print(Animals.descCat.description) // -> "I has attitude"
Обратите внимание, что строковые перечисления уже сами по себе CustomStringConvertible
так что у них уже есть description
свойство (которое возвращает имя регистра enum), а ваше не переопределяет его:
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
своего собственного).