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

时间:2018-04-12 18:02:45

标签: swift enums swift-protocols

我正在尝试找到一种向枚举添加“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
    }
}

2 个答案:

答案 0 :(得分:0)

您需要使用正确的Self引用而不是self,并将扩展名限制为只有RawValue Int的类型。

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

答案 1 :(得分:0)

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