У меня есть протокол, который я использую для нескольких перечислений, который включает в себя CaseIterable Swift 4.2
public protocol CycleValue: CaseIterable {
/// Computed property that returns the next value of the property.
var nextValue:Self { get }
}
Один из моих вариантов использования для CycleValue - свойство Theme:
@objc public enum AppThemeAttributes: CycleValue {
case classic, darkMode // etc.
public var nextValue: AppThemeAttributes {
guard self != AppThemeAttributes.allCases.last else {
return AppThemeAttributes.allCases.first!
}
return AppThemeAttributes(rawValue: self.rawValue + 1)!
}
}
У меня есть другие случаи использования;например, типы кнопок.CaseIterable делает реализацию nextValue легкой, но одинаковой для всех типов CycleValue.
Я хотел бы реализовать расширение CycleValue, которое обеспечивает реализацию по умолчанию для свойства nextValue и избегает дублирования кода (т. Е. DRY!).
Я боролся с PAT (связанными с протоколом типами).Кажется, не получается получить правильный синтаксис.
Это должно быть возможно, верно?Как я могу предоставить реализацию по умолчанию для nextValue, чтобы избежать дублирования од?