如何不使用Swift 2.0枚举重复自己

mat*_*att 2 enums swift2

我有多个带有原始值的枚举,但我不喜欢rawValue:每次从原始值初始化一个时都要说,所以我提供了一个没有外部标签的替代委托初始化程序:

enum E1 : Int {
    case One, Two
    init?(_ what:Int) {
        self.init(rawValue:what)
    }
}
enum E2 : Int {
    case One, Two
    init?(_ what:Int) {
        self.init(rawValue:what)
    }
}
Run Code Online (Sandbox Code Playgroud)

非常好.我可以说let e = E1(0),正确的事情发生了.

现在我想巩固重复的代码.我希望Swift 2.0协议扩展允许我这样做 - init?(_ what:Int)一个地方编写初始化程序并在两个枚举中注入/继承它.但是,我还没有找到一种有效的方法.问题是协议扩展不知道采用者将一个init(rawValue:)初始化器,我还没有找到一种方法来保证它.

我怀疑这是因为rawValue初始化程序的自动化方式,所以可能没有什么可以做的.但也许有人有一个建议.

ABa*_*ith 6

听起来你正在寻求扩展RawRepresentable协议:

extension RawRepresentable {
    init?(_ what: RawValue) {
        self.init(rawValue: what)
    }
}
Run Code Online (Sandbox Code Playgroud)

任何具有原始类型的枚举都会自动符合RawRepresentable,因此您无需制作E1E2符合任何额外协议:

enum E1: Int {
    case One = 1, Two
}

enum E2: String {
    case One = "1", Two = "2"
}

let e1 = E1(1)   // .One
let e2 = E2("2") // .Two
Run Code Online (Sandbox Code Playgroud)

  • 简单但(对我而言)是革命性的 - 它并没有发生在我身上.实际上,它甚至比那更好.我可以说`扩展RawRepresentable其中Self:Attribute`,现在我正在做我真正想做的事情,这是(1)仅针对某些枚举执行此操作,以及(2)保持将我的并行枚举包含在一种常见的类型. (2认同)