我试图使枚举中的多个协议与单个协议一致。如果我把它们分开打就行了。但是,如果我尝试将它们合并到一个协议中,它就不起作用。
我有以下枚举

enum Theme:Int,CaseIterable,CustomStringConvertible {
  case light
  case dark

var description: String {
    switch self {
    case .light:
        return "Light Theme"
    case .dark:
        return "Dark Theme"
    }
}

var backgroundColor: Color {
    switch self {
    case .light:
        return .white
    case .dark:
        return .black
    }
  }
}

我试着用这个把它的一致性转换成协议
public protocol ThemeProvider where T.RawValue == Int {
    associatedtype T:RawRepresentable,CaseIterable,CustomStringConvertible
}

并将枚举定义更改为enum Theme:ThemeProvider
但是它说“Theme”不符合预期的类型“ThemeProvider”向枚举添加协议的正确方法是什么?
注:以上代码是Swift 4.2,使用了新的协议CaseIterable

最佳答案

将枚举定义从enum Theme: Int, CaseIterable, CustomStringConvertible {更改为enum Theme:ThemeProvider {不会使主题自动具有T,而这是ThemeProvider所必需的。
如果添加typealias T = Theme则主题枚举仍然没有Int, CaseIterable, CustomStringConvertible,因为typealias T = Theme不会使任何类型(此处的主题)符合任何协议。
这就是为什么需要enum Theme: Int, CaseIterable, CustomStringConvertible, ThemeProvider { typealias T = Theme ...使主题符合ThemeProvider的原因。
您可能想要的是enum Theme: Int, ThemeProvider {其中的eprovider是public protocol ThemeProvider: RawRepresentable, CaseIterable, CustomStringConvertible {}
更不能没有任何例子。

10-05 20:22