Swift 使用协议将案例添加到现有枚举
我想创建一个Swift 使用协议将案例添加到现有枚举,swift,enums,protocols,Swift,Enums,Protocols,我想创建一个协议,该协议在符合该协议的所有枚举上强制执行特定的案例 例如,如果我有这样一个enum: enum Foo{ case bar(baz: String) case baz(bar: String) } 我想通过添加另一个案例的协议扩展它: case Fuzz(Int) 这可能吗?不,因为您不能在枚举设计之外声明案例 解决方法是将结构与静态变量一起使用 注意:这是在Swift 3中对通知所做的操作。Name 以下是对Swift 3的实施 结构: 援引 注: 请注意,
协议
,该协议在符合该协议的所有枚举
上强制执行特定的案例
例如,如果我有这样一个enum
:
enum Foo{
case bar(baz: String)
case baz(bar: String)
}
我想通过添加另一个案例的协议扩展它:
case Fuzz(Int)
这可能吗?不,因为您不能在枚举
设计之外声明案例
解决方法是将结构
与静态
变量一起使用
注意:这是在Swift 3中对通知所做的操作。Name
以下是对Swift 3的实施
结构:
援引
注:
请注意,此方法不能替代enum
,只有在编译时值未知时才使用此方法。扩展名可以添加嵌套的enum
,如下所示:
enum Plants {
enum Fruit {
case banana
}
}
extension Plants {
enum Vegetables {
case potato
}
}
以下是一些可能对其他人有所帮助的额外措施:
以您的例子:
enum Foo {
case bar(baz: String)
case baz(bar: String)
}
您可以考虑在自己的<代码> EnUM <代码> > < /P>中“嵌套”它。
enum FooExtended {
case foo(Foo) // <-- Here will live your instances of `Foo`
case fuzz(Int)
}
可能有很多地方,其中一个、另一个或两个解决方案都毫无意义,但我很确定它们可能对某些人来说很方便(即使只是作为练习)。为什么要将协议冷藏车
空着,只是为了扩展它…?这只是为了表明扩展是可能的,而且这个解决方案即使有扩展也可以工作。CoolCar可能是在一个框架中定义的(例如:Standard Library/Foundation),您可能无法直接修改它。您可以对其进行扩展,但此解决方案仍然有效。我们如何从该结构中生成类似Car.Red(参数:String)的大小写?问题是,现在您需要始终为开关定义默认值。该开关无法与uitableview一起使用。如果我也这样做,我需要在cellforrow中设置开关来检查它是哪个部分,它将无法工作
enum Plants {
enum Fruit {
case banana
}
}
extension Plants {
enum Vegetables {
case potato
}
}
enum Foo {
case bar(baz: String)
case baz(bar: String)
}
enum FooExtended {
case foo(Foo) // <-- Here will live your instances of `Foo`
case fuzz(Int)
}
enum FooExtended {
case bar(baz: String)
case baz(bar: String)
case fuzz(Int)
init(withFoo foo: Foo) {
switch foo {
case .bar(let baz):
self = .bar(baz: baz)
case .baz(let bar):
self = .baz(bar: bar)
}
}
}