【问题标题】:Adopting Equatable Protocol for Enum with nested Enum values对具有嵌套枚举值的枚举采用 Equatable 协议
【发布时间】:2016-02-19 12:43:10
【问题描述】:

假设我们有这个数据结构:

enum Vehicle: Equatable {

   enum Car {
       case BMW(Int)
       case Audi(Int)
   }

   enum Bike {
       case Ducatti(Int)
       case Honda(Int)
   }

}

表示各种车辆,其马力为相关值。

我正在尝试遵守Equatable 协议,以便能够执行Vehicle 等效但没有成功。

我正在尝试:

func ==(a: Vehicle, b: Vehicle) -> Bool {
    switch(a, b) {
        case(let Car.BMW(hp1), let Car.BMW(hp2)):
           return hp1 == hp2
        default:
           return false
    }
}

但编译器抱怨invalid pattern

那么对于包含嵌套枚举和关联值的枚举,我们如何才能正确地遵守Equatable 协议呢?

【问题讨论】:

  • 我不清楚 Vehicle 是一个有效的枚举——它当然没有实际的枚举值——你所做的只是声明两种类型......
  • 绝对有效。 let value = Vehicle.Car.BMW(2500) 工作正常。
  • 不,value 不是Vehicle,而是Vehicle.Car。检查其.dynamicType
  • 嗯...应该是Vehicle.Car,不是吗?
  • 不,valuevalue 应该是 Vehicle.Car,而不是它的 dynamicType...

标签: iphone swift enums swift2


【解决方案1】:

正如其他人所指出的,您对嵌套枚举的定义不会创建 Vehicle 的情况。它们只是定义了两种类型,除了它们的名称之外,它们彼此没有任何关系。你想要做的看起来像这样:

enum Vehicle: Equatable {
    enum CarType {
        case BMW(Int)
        case Audi(Int)
    }

    enum BikeType {
        case Ducatti(Int)
        case Honda(Int)
    }

    case Car(CarType)
    case Bike(BikeType)
}

func ==(a: Vehicle, b: Vehicle) -> Bool {
    switch (a, b) {
    case (.Car(.BMW(let hp1)), .Car(.BMW(let hp2))):
        return hp1 == hp2
    default:
        return false
    }
}

let bmw1 = Vehicle.Car(.BMW(1))
let bmw2 = Vehicle.Car(.BMW(1))
let bmw3 = Vehicle.Car(.BMW(2))
bmw1 == bmw2 // true
bmw2 == bmw3 // false

【讨论】:

    【解决方案2】:

    您的Vehicle 并不是一个真正有效的枚举——它当然没有任何枚举值。 CarBike 只是类型声明,Vehicle 是它们的作用域。这就是为什么

    let value = Vehicle.Car.BMW(2500) 
    

    有效 - 但value类型 不是Vehicle,而是Vehicle.Car

    【讨论】:

    • 我理解你的意思,你是对的,因为Vehicle 没有案例,所以它在实践中不是有效的枚举。它被声明为提供某种命名空间。我发现为了执行相等检查,像CarBike 这样的嵌套枚举需要符合Equatable 而不是顶级Vehicle。这似乎行得通。但是,是否有任何其他通用方法可以使Vehicle 符合Equatable?这就是提问的目的。谢谢。
    • 好吧,除非Vehicle确实有case,否则Equatable是没有意义的,它只是一个作用域。您可以添加案例case Auto(Car) case Cycle(Bike)...
    【解决方案3】:

    问题是,

    let a = Vehicle.Car.BMW(100)
    

    不是 Vehicle 类型的常量,而是 Vehicle.Car ... 等。您希望如何从您的示例中创建 Vehicle 的变量或常量?

    考虑到,enum Vehicle 根本没有案例...

    【讨论】:

      猜你喜欢
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多