枚举中的多协议一致性不起作用
Multiple protocol conformace in enum doesn't work
我正在尝试使枚举中的多个协议与单个协议一致。如果我分别输入它们,它就可以工作。但是,如果我尝试将它们组合在一个协议中,它就不起作用。
我有以下枚举
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
的新协议
将枚举定义从 enum Theme: Int, CaseIterable, CustomStringConvertible {
更改为 enum Theme:ThemeProvider {
不会使 Theme 自动具有 T
,这是 ThemeProvider 所要求的。
如果你添加 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 {}
。
没有例子不能多说
我正在尝试使枚举中的多个协议与单个协议一致。如果我分别输入它们,它就可以工作。但是,如果我尝试将它们组合在一个协议中,它就不起作用。
我有以下枚举
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
将枚举定义从 enum Theme: Int, CaseIterable, CustomStringConvertible {
更改为 enum Theme:ThemeProvider {
不会使 Theme 自动具有 T
,这是 ThemeProvider 所要求的。
如果你添加 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 {}
。
没有例子不能多说