我将枚举定义为确认协议(protocol)可事件:
protocol Eventable {
var name: String { get }
static var all: [Eventable] { get }
}
enum MyEnum: String, Eventable {
case bla = "bla"
case blu = "blu"
var name: String {
return self.rawValue
}
static var all: [Eventable] {
return [
MyEnum.bla,
MyEnum.blu
]
}
}
我还有其他枚举,例如 MyEnum,其形式也如下: 枚举 Bla:字符串,可事件 { }
我有两个问题:
对于具有字符串数据类型的枚举,我想避免重复生成变量名称:
变量名称:字符串
我不知道如何用 Swift 编写它。我尝试使用“where”子句但没有成功。我怎样才能实现这一目标?当我编写枚举并遵守该部分的协议(protocol)时:
static var all: [Eventable] { get }
。 我希望对于枚举 MyEnum,它将变量限制为:static var all: [MyEnum] { ... }
因为现在我可以在返回的数组中放入任何可事件元素,但这不是我需要的。 除此之外,我尝试在协议(protocol)中为其定义通用约束,但出现以下错误:
Protocol 'Eventable' can only be used as a generic constraint because it has Self or associated type requirements
非常感谢您的帮助!
最佳答案
对于你的第二个问题,你只需要使用Self
:
protocol Eventable {
var name: String { get }
static var all: [Self] { get }
}
Self
,与self
类似,只是表示“当前类型”。
第一个问题有点难,因为你无法真正安全地获取枚举的所有值。请参阅here了解更多信息。我得到的最接近的是:
extension Eventable where Self: RawRepresentable, Self.RawValue == String {
var name: String {
return self.rawValue
}
}
这意味着您可以省略 MyEnum
中的 name
声明,但不能省略 all
。
关于swift - 多个枚举实现协议(protocol)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47269528/