1

我正在尝试使多个协议与枚举中的单个协议一致。如果我单独输入它们,它就可以工作。但是,如果我尝试将它们组合在一个协议中,它就不起作用。

我有以下枚举

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

但是它说“主题”不符合预期的类型“主题提供者”将协议添加到枚举的正确方法是什么?

PS:上面的代码是 Swift 4.2 并且使用了新的协议叫做CaseIterable

4

1 回答 1

0

将枚举定义从 更改enum Theme: Int, CaseIterable, CustomStringConvertible {enum Theme:ThemeProvider {不会使 Theme 自动具有TThemeProvider 所需的 。

如果您添加typealias T = Theme,则 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 {}

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

于 2018-07-22T12:20:20.480 回答