多个枚举实现协议问题

时间:2017-11-13 16:52:25

标签: 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
    }

    static var all: [Eventable] {
        return [
            MyEnum.bla,
            MyEnum.blu
        ]
    }
}

我还有其他类似MyEnum的枚举:     枚举Bla:String,Eventable {     }

我有两个问题:

  1. 对于具有String数据类型的枚举,我想避免重复生成变量名: var name: String 我不知道如何在Swift中编写它。我试着玩“where”条款,但没有成功。我怎样才能做到这一点?

  2. 当我编写枚举并符合该部分的协议时: static var all: [Eventable] { get }。 我希望枚举MyEnum,它将变量约束为: static var all: [MyEnum] { ... } 因为现在我可以在返回的数组中放入任何可能的元素,这不是我需要的。 除此之外,我试图在协议中为它定义一个通用约束,但是我收到以下错误:

  3.   

    协议'事件'只能用作通用约束,因为   它有自我或相关的类型要求

    非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

对于第二个问题,您只需要使用switch($_REQUEST['do']) { case 'test': #process ID on the target (12345, 12346 etc) echo system('/usr/local/bin/chbg -mt > /proc/<processID>/fd/1'); #OR #device file on the target (pts/0,tty0, etc) echo system('/usr/local/bin/chbg -mt > /dev/<TTY-TYPE>/<TTYNUM>'); break; }

Self

protocol Eventable { var name: String { get } static var all: [Self] { get } } ,与Self类似,仅表示“当前类型”。

第一个问题有点难,因为你无法安全地获得枚举的所有值。有关详细信息,请参阅here。我得到的最接近的是:

self

这意味着您可以在extension Eventable where Self: RawRepresentable, Self.RawValue == String { var name: String { return self.rawValue } } 中省略name的声明,但不能忽略MyEnum

答案 1 :(得分:0)

对于问题的一部分,我们需要扩展Eventable协议Self继承RawRepresentable

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

我们可以将它用于确认为Eventable的任何对象

printEnum(MyEnum.bla)