非标称类型 "Self" 不支持显式初始化(​​枚举的协议扩展)

Non-nominal type "Self" doesn't support explicit initialisation (protocol extension for enums)

我正在尝试找到一种方法,将 "count" 变量添加到枚举中,以允许量化案例数。这很简单,当硬编码到每个枚举中时效果很好,但逻辑扩展是使其成为协议扩展......但我 运行 进入上述错误。

阅读其他帖子表明编译器没有足够的信息来实例化枚举。我尝试添加关联类型,但错误仍然存​​在。这只是我必须放弃的东西吗?这不是很重要,但我想了解我做错了什么。

代码如下:

protocol CountableEnum: RawRepresentable {
    static var count: Int { get }
}

extension CountableEnum {
    static var count: Int {
        var max = 0
        while let _ = self(rawValue: max) { max += 1 }
        return max
    }
}

您需要使用正确的 Self 引用而不是 self 并将您的扩展限制为仅具有 IntRawValue 类型。

protocol CountableEnum: RawRepresentable {
    static var count: Int { get }
}

extension CountableEnum where RawValue == Int {
    static var count: Int {
        var max = 0
        while let _ = Self(rawValue: max) { max += 1 }
        return max
    }
}

RawRepresentable 有一个关联类型 RawValue,在您的示例中它没有指定它是 Int。如果您使用 where 约束协议扩展,如下例所示,它应该可以正常工作。

protocol CountableEnum: RawRepresentable {
  static var count: Int { get }
}

extension CountableEnum where RawValue == Int {
  static var count: Int {
    var max = 0
    while let _ = self.init(rawValue: max) { max += 1 }
    return max
  }
}