2016-02-19 101 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有任何情況下,在所有...