【问题标题】:Multiple protocol conformace in enum doesn't work枚举中的多协议一致性不起作用
【发布时间】:2018-07-22 11:06:11
【问题描述】:

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

我有以下枚举

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 的新协议

【问题讨论】:

    标签: swift swift-protocols swift4.2


    【解决方案1】:

    将枚举定义从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 ... 才能使 Theme 符合 ThemeProvider。

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

    没有例子就不能说更多了。

    【讨论】:

    • 感谢您的回复。我通过定义像 public protocol ThemeProvider:RawRepresentable,CaseIterable,CustomStringConvertible where RawValue == Int { } 这样的协议并像 enum MDTheme:Int,ThemeProvider { 这样定义主题解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多