Как реализовать протокол в перечислении enum?

Рейтинг: 0Ответов: 1Опубликовано: 28.07.2023

У меня есть протокол (который нельзя изменять! Даже через exctention)

protocol CalorieCountProtocol {
     var calories: Int { get }
     func description() -> String
}

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

enum SomeEnum: CalorieCountProtocol {
    case calories(Int)
    func description() -> String {
        switch self {
        case .calories(10):
            return "wtf where elon musk its just 10 calories"
        default:
            return "yeeeeah its elon musk"
        }
    }
}

let someEnumTest: SomeEnum = SomeEnum.calories(10)

Но получаю ошибку:

Type 'SomeEnum' does not conform to protocol 'CalorieCountProtocol'

Xcode предлагает добавить в enum calories в качестве переменной, но ведь я не могу сделать этого в перечеслении?

Ответы

▲ 0Принят

Всё верно в ошибке.

Ваш протокол CalorieCountProtocol требует наличия свойства calories и метода description(), но у вас в перечислении SomeEnum нет свойства calories.

Нельзя изменять?
Хорошо, но можно же расширить? Сделаем CalorieCountProtocol для перечисления, используя вычисляемое свойство и связанные значения:

extension SomeEnum: CalorieCountProtocol {
    var calories: Int {
        switch self {
        case .calories(let count):
            return count
        }
    }
}

print(someEnumTest.description())
print(someEnumTest.calories)
Вывод:
wtf where elon musk its just 10 calories
10

А вот в enum SomeEnum: CalorieCountProtocol {} необходимо убрать CalorieCountProtocol, иначе будет ошибка "redundant conformance", потому что после добавления реализации протокола CalorieCountProtocol в расширении для перечисления, повторное указание соответствия протоколу в определении самого перечисления становится избыточным.