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)