非标称类型 "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
并将您的扩展限制为仅具有 Int
的 RawValue
类型。
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
}
}
我正在尝试找到一种方法,将 "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
并将您的扩展限制为仅具有 Int
的 RawValue
类型。
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
}
}