如何创建与已初始化的枚举一起使用的协议扩展?

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()
        }
    }
}

效果很好。然后在应用程序的另一部分中使用了类似但略有不同的 enumDoorModeService:

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   
}