【问题标题】:Non-nominal type "Self" doesn't support explicit initialisation (protocol extension for enums)非标称类型“Self”不支持显式初始化(​​枚举的协议扩展)
【发布时间】:2018-04-12 18:02:45
【问题描述】:

我正在尝试找到一种将“计数”变量添加到枚举的方法,以允许量化案例的数量。这很简单,并且在硬编码到每个枚举中时效果很好,但逻辑扩展是使其成为协议扩展......但我遇到了上述错误。

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

代码如下:

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

【问题讨论】:

  • 与错误本身无关,但请记住,您的 count 变量并不总是包含正确的值,因为 enum 原始值也可以手动设置,在这种情况下它们不必从 0 开始,也不必递增 1。
  • 谢谢 - 我知道这是一种风险,但该协议仅用于内部测试过程(生成随机枚举),不会成为公共 API 的一部分。我可能会根据我的偏执程度设置一个测试用例来检查这种情况!

标签: swift enums swift-protocols


【解决方案1】:

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

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

【讨论】:

  • while Self(rawValue: max) != nil
  • 非常好——怀疑编译器只是需要更多帮助,我只是不熟悉如何定义约束。感谢您的帮助:-)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多