Можете ли вы продлить перечисление?

Я использую перечисления для хранения строковых значений, как это:

    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 своего собственного).

Другие вопросы по тегам