如何创建与已初始化的枚举一起使用的协议扩展?
How do I create protocol extensions that work with enums that have been initialized?
我有一个 enum
用于 class
DoorModeModel
:
enum DoorModeName: String {
case off = "MODE_OFF"
case exit = "MODE_EXIT"
case auto = "MODE_AUTO"
case partial = "MODE_PARTIAL"
case open = "MODE_OPEN"
}
然后应用中有两个不同的目标使用不同的描述。我把这些放在基于目标的扩展中:
extension DoorModeModel.DoorModeName {
var presentableName: String {
switch self {
case .off: return "MODE_OFF".localized()
case .exit: return "MODE_EXIT".localized()
case .auto: return "MODE_AUTO".localized()
case .partial: return "MODE_PARTIAL".localized()
case .open: return "MODE_OPEN".localized()
}
}
}
然后是另一个分机:
extension DoorModeModel.DoorModeName {
var presentableName: String {
switch self {
case .off: return "MODE_OFF_2".localized()
case .exit: return "MODE_EXIT_2".localized()
case .auto: return "MODE_AUTO_2".localized()
case .partial: return "MODE_PARTIAL_2".localized()
case .open: return "MODE_OPEN_2".localized()
}
}
}
效果很好。然后在应用程序的另一部分中使用了类似但略有不同的 enum
,DoorModeService
:
enum OperatingModeName: Int {
case off = 0
case exit = 1
case auto = 2
case partial = 3
case open = 4
}
和以前一样,根据target
有不同的描述。就像我为他们创建 extensions
之前一样。代码和上面两个extensions
完全一样,只是扩展了一个不同的enum
:
extension DoorModeService.OperatingModeName {
var description: String {
switch self {
...
我不想要重复的代码,所以我试图找到一种方法来对两个 enums
使用相同的 enum
描述。我认为可以使用 protocol extensions
来做到这一点,但是由于 extensions
不知道 enums,
我不知道这是如何工作的:
protocol EnumDescription {
var description: String { get }
}
extension EnumDescription {
var description: String {
switch self {
case .off: return "MODE_OFF".localized()
case .exit: return "MODE_EXIT".localized()
case .auto: return "MODE_AUTO".localized()
case .partial: return "MODE_PARTIAL".localized()
case .open: return "MODE_OPEN".localized()
}
}
}
这给了我错误 Cannot infer contextual base in reference to member 'x'
我是否将 extension
设置为符合 enums
,例如:
extension EnumDescription where self == enumSomething
或者如何对我创建的两个 enums
使用相同的描述?
您可以创建 static
属性 类型为 Self
的要求,用于协议中 2 enum
之间的所有常见情况,以便能够在description
.
的执行
protocol ModeName: CustomStringConvertible, Equatable {
static var off: Self { get }
static var exit: Self { get }
static var auto: Self { get }
static var partial: Self { get }
static var open: Self { get }
}
extension ModeName {
var description: String {
switch self {
case .off: return "MODE_OFF".localized()
case .exit: return "MODE_EXIT".localized()
case .auto: return "MODE_AUTO".localized()
case .partial: return "MODE_PARTIAL".localized()
case .open: return "MODE_OPEN".localized()
default:
return ""
}
}
}
enum DoorModeName: String, ModeName {
case off = "MODE_OFF"
case exit = "MODE_EXIT"
case auto = "MODE_AUTO"
case partial = "MODE_PARTIAL"
case open = "MODE_OPEN"
}
enum OperatingModeName: Int, ModeName {
case off = 0
case exit = 1
case auto = 2
case partial = 3
case open = 4
}
我有一个 enum
用于 class
DoorModeModel
:
enum DoorModeName: String {
case off = "MODE_OFF"
case exit = "MODE_EXIT"
case auto = "MODE_AUTO"
case partial = "MODE_PARTIAL"
case open = "MODE_OPEN"
}
然后应用中有两个不同的目标使用不同的描述。我把这些放在基于目标的扩展中:
extension DoorModeModel.DoorModeName {
var presentableName: String {
switch self {
case .off: return "MODE_OFF".localized()
case .exit: return "MODE_EXIT".localized()
case .auto: return "MODE_AUTO".localized()
case .partial: return "MODE_PARTIAL".localized()
case .open: return "MODE_OPEN".localized()
}
}
}
然后是另一个分机:
extension DoorModeModel.DoorModeName {
var presentableName: String {
switch self {
case .off: return "MODE_OFF_2".localized()
case .exit: return "MODE_EXIT_2".localized()
case .auto: return "MODE_AUTO_2".localized()
case .partial: return "MODE_PARTIAL_2".localized()
case .open: return "MODE_OPEN_2".localized()
}
}
}
效果很好。然后在应用程序的另一部分中使用了类似但略有不同的 enum
,DoorModeService
:
enum OperatingModeName: Int {
case off = 0
case exit = 1
case auto = 2
case partial = 3
case open = 4
}
和以前一样,根据target
有不同的描述。就像我为他们创建 extensions
之前一样。代码和上面两个extensions
完全一样,只是扩展了一个不同的enum
:
extension DoorModeService.OperatingModeName {
var description: String {
switch self {
...
我不想要重复的代码,所以我试图找到一种方法来对两个 enums
使用相同的 enum
描述。我认为可以使用 protocol extensions
来做到这一点,但是由于 extensions
不知道 enums,
我不知道这是如何工作的:
protocol EnumDescription {
var description: String { get }
}
extension EnumDescription {
var description: String {
switch self {
case .off: return "MODE_OFF".localized()
case .exit: return "MODE_EXIT".localized()
case .auto: return "MODE_AUTO".localized()
case .partial: return "MODE_PARTIAL".localized()
case .open: return "MODE_OPEN".localized()
}
}
}
这给了我错误 Cannot infer contextual base in reference to member 'x'
我是否将 extension
设置为符合 enums
,例如:
extension EnumDescription where self == enumSomething
或者如何对我创建的两个 enums
使用相同的描述?
您可以创建 static
属性 类型为 Self
的要求,用于协议中 2 enum
之间的所有常见情况,以便能够在description
.
protocol ModeName: CustomStringConvertible, Equatable {
static var off: Self { get }
static var exit: Self { get }
static var auto: Self { get }
static var partial: Self { get }
static var open: Self { get }
}
extension ModeName {
var description: String {
switch self {
case .off: return "MODE_OFF".localized()
case .exit: return "MODE_EXIT".localized()
case .auto: return "MODE_AUTO".localized()
case .partial: return "MODE_PARTIAL".localized()
case .open: return "MODE_OPEN".localized()
default:
return ""
}
}
}
enum DoorModeName: String, ModeName {
case off = "MODE_OFF"
case exit = "MODE_EXIT"
case auto = "MODE_AUTO"
case partial = "MODE_PARTIAL"
case open = "MODE_OPEN"
}
enum OperatingModeName: Int, ModeName {
case off = 0
case exit = 1
case auto = 2
case partial = 3
case open = 4
}