Подтвердить что ты не робот

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

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

    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 {} к каждому перечислению?

4b9b3361

Ответ 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).