采用嵌套枚举值的Enum Equatable Protocol

时间:2016-02-19 12:43:11

标签: iphone swift enums swift2

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

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

那么我们如何才能正确地符合包含嵌套枚举和关联值的枚举的{{1}}协议?

3 个答案:

答案 0 :(得分:1)

你的Vehicle实际上不是一个有效的枚举 - 它肯定没有任何枚举值。 CarBike只是类型声明,而Vehicle是它们的范围。这就是

的原因
let value = Vehicle.Car.BMW(2500) 

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

答案 1 :(得分:1)

麻烦的是,

let a = Vehicle.Car.BMW(100)

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

请注意,enum Vehicle完全没有案例......

答案 2 :(得分: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