枚举中的多协议一致性不起作用

时间:2018-07-22 11:06:12

标签: swift swift-protocols swift4.2

我正在尝试使枚举中的多个协议与单个协议兼容。如果我分别键入它们,它将起作用。但是,如果我尝试将它们合并为一个协议,则无法正常工作。

我有以下枚举

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'。将协议添加到枚举的正确方法是什么?

PS:上面的代码是Swift 4.2,并使用了名为CaseIterable的新协议

1 个答案:

答案 0 :(得分:0)

将枚举定义从enum Theme: Int, CaseIterable, CustomStringConvertible {更改为enum Theme:ThemeProvider {不会使Theme自动具有T,这是ThemeProvider必需的。

如果您添加typealias T = Theme,则主题枚举仍不具有Int, CaseIterable, CustomStringConvertible,原因是typealias T = Theme没有使任何类型(此处的主题)符合任何协议。

这就是为什么需要enum Theme: Int, CaseIterable, CustomStringConvertible, ThemeProvider { typealias T = Theme ...才能使Theme符​​合ThemeProvider的原因。

您可能想要的是enum Theme: Int, ThemeProvider {,其中ThemeProvider为public protocol ThemeProvider: RawRepresentable, CaseIterable, CustomStringConvertible {}

没有任何例子就不能说更多。

相关问题