Swift 多枚举实现协议问题
我将枚举定义为确认协议事件:Swift 多枚举实现协议问题,swift,enums,protocols,Swift,Enums,Protocols,我将枚举定义为确认协议事件: 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 } sta
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:字符串,可事件{
}
我有两个问题:
var名称:字符串
我不知道怎么用Swift写。我试图玩弄“where”条款,但没有成功。我怎样才能做到这一点静态变量all:[Eventable]{get}
。
我希望对于enum MyEnum,它将变量约束为:
静态变量all:[MyEnum]{…}
因为现在我可以在返回的数组中放入任何可事件的元素,而这不是我所需要的。
除其他事项外,我试图在协议中为其定义一个通用约束,但出现以下错误:非常感谢你的帮助 对于第二个问题,您只需要使用
Self
:
protocol Eventable {
var name: String { get }
static var all: [Self] { get }
}
Self
,类似于Self
,只是表示“当前类型”
第一个问题有点难,因为您无法真正安全地获取枚举的所有值。有关更多信息,请参阅。我得到的最接近的结果是:
extension Eventable where Self: RawRepresentable, Self.RawValue == String {
var name: String {
return self.rawValue
}
}
这意味着您可以在
MyEnum
中省略name
的声明,但对于问题中需要扩展Eventable
协议的部分,Self
继承rawrrepresentable
protocol Eventable {
var name: String { get }
static var all: [Self] { get }
}
extension Eventable where Self: RawRepresentable {
var name: Self.RawValue {
return self.rawValue
}
}
enum MyEnum: String, Eventable {
case bla = "bla"
case blu = "blu"
static var all: [MyEnum] = [bla, blu]
}
对于问题的第二部分,我们需要将函数配置为处理泛型类型
我建议将函数设置为通用函数,这里是一个示例
func printEnum<T: Eventable>(_ event: T) {
print(event.name)
}
谢谢你的回答:)对于第一个问题,它就像一个符咒。对于第二个问题,当我试图使用它时,我得到的错误(协议“可事件”只能用作通用约束,因为它具有自我或关联类型要求)。@托卡,如果您认为我的答案回答您的问题,请考虑通过点击该复选标记接受它。当你回答“对不起”时,我正在编辑我的消息。对于第二个问题,我仍然有上述问题。你知道为什么吗?@Toka你用的是我的密码吗?或者错误发生在其他地方,而不是扩展中?基本上,错误表明您不能再将
Eventable
用作方法参数或变量类型,因为其中包含Self
。是的,我使用了您提供的代码。例如,我有一个函数,它在另一个触发错误的对象中具有以下签名:func-track(event:Eventable)
谢谢你的回答,我会尝试一下:)
printEnum(MyEnum.bla)