Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用协议将案例添加到现有枚举_Swift_Enums_Protocols - Fatal编程技术网

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