假设我们有这个数据结构:
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}}协议?
答案 0 :(得分:1)
你的Vehicle
实际上不是一个有效的枚举 - 它肯定没有任何枚举值。 Car
和Bike
只是类型声明,而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