我有多个带有原始值的枚举,但我不喜欢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初始化程序的自动化方式,所以可能没有什么可以做的.但也许有人有一个建议.
听起来你正在寻求扩展RawRepresentable协议:
extension RawRepresentable {
init?(_ what: RawValue) {
self.init(rawValue: what)
}
}
Run Code Online (Sandbox Code Playgroud)
任何具有原始类型的枚举都会自动符合RawRepresentable,因此您无需制作E1或E2符合任何额外协议:
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)