2016-02-19 107 views
2

假设我们有这样的数据结构:采用Equatable协议枚举具有嵌套枚举值

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协议的枚举包含嵌套的枚举和相关的值?

+0

目前尚不清楚,我认为汽车是一种有效的枚举 - 它肯定有没有实际的枚举值 - 所有你正在做的是声明两种类型... – Grimxn

+0

这绝对有效。 '让价值= Vehicle.Car.BMW(2500)'工作正常。 – Thanos

+1

不,'value'不是'Vehicle',而是'Vehicle.Car'。检查它的'.dynamicType' – Grimxn

回答

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 
1

您的Vehicle不是一个真正有效的枚举 - 它肯定没有任何枚举值。 CarBike只是类型声明,而Vehicle是它们的一个范围。这就是为什么

let value = Vehicle.Car.BMW(2500) 

作品 - 但value不是Vehicle这是一个Vehicle.Car

+0

我理解你的观点,你是对的它在实践中不是有效的枚举,因为'Vehicle'没有案例。它被声明为提供某种类型的命名空间。我发现为了执行平等检查,像Car和Bike这样的嵌套枚举需要符合Equatable而不是顶级的Vehicle。这似乎工作。然而,有没有其他的一般方法来使'Vehicle'符合'Equatable'?这是问题的目的。谢谢。 – Thanos

+1

那么,除非'Vehicle'实际上有案例,'Equatable'没有意义,它只是一个范围。你*可以*添加案例'案例自动(汽车)案件周期(自行车)'... – Grimxn

1

麻烦的是,这

let a = Vehicle.Car.BMW(100) 

不恒定类型的车辆,但Vehicle.Car ......等你想怎样打造您的示例中的变量或车辆的不断?

采取帐户,enum Vehicle有任何情况下,在所有...