2016-02-26 49 views
0

我不確定這是否可能,但我想知道是否可以將嵌套的枚舉值轉換爲單個變量,以便它們可以傳入函數參數。例如:將嵌套的枚舉值轉換爲一個變量作爲函數參數傳遞

enum Food { 
    enum Vegetables: String { 
    case Spinach = "Spinach" 
    case GreenBeans = "Green Beans" 
    } 
    enum Fruit: String { 
    case Apples = "Apples" 
    case Grapes = "Grapes" 
    } 
} 

func eat(meal:Food.Vegetables) { 
    print("I just ate some \(meal.rawValue)") 
} 

func eat(meal:Food.Fruit) { 
    print("I just ate some \(meal.rawValue)") 
} 

eat(Food.Fruit.Apples)   //"I just ate some Spinach\n" 
eat(Food.Vegetables.Spinach) //"I just ate some Apples\n" 

這裏的一切工作,因爲它應該,但我想鞏固我的兩個吃功能到1.有沒有辦法做到這一點?我想它會涉及一個變量,它表示所有可以傳入一個吃飯功能的嵌套變量類型。例如:

func eat(fruitOrVegetable: Food.allNestedEnumeratorTypes) { 
    print("I just ate some \(fruitOrVegetable.rawValue)") 
} 

eat(Food.Vegetables.GreenBeans) //"I just ate some Green Beans\n" 
eat(Food.Vegetables.Grapes)  //"I just ate some Grapes\n" 

這可能嗎?

+1

@ vadian的回答是好,你也可以想看看http://stackoverflow.com/questions/35505655/adopting-equatable-protocol-for-enum-with-nested-enum-value S/35506786#35506786。重要的是要明白'蔬菜'和'水果'在這裏沒有任何關係。除了創建一個命名空間外,「食物」完全沒有任何功能。除了名字,如果你擺脫了「食物」,這段代碼將是相同的。在這裏沒有承諾,你碰巧把每個枚舉放在'Food'中都會有'rawValue'屬性。 –

+0

感謝您的回覆。在這種情況下,我完全理解你對食物的含義。我將枚舉器列表嵌套在命名空間中的唯一原因純粹是爲了組織目的,因爲我的應用程序中有許多枚舉列表。 – DJSK

回答

3

你可以使用一個協議

protocol Vegetarian { 
    var rawValue : String { get } 
} 

,並把它添加到兩個枚舉

enum Vegetables: String, Vegetarian { ... } 
enum Fruit: String, Vegetarian { ... } 

然後你就可以宣佈eat

func eat(meal:Vegetarian) { 
    print("I just ate some \(meal.rawValue)") 
} 

eat(Food.Vegetables.GreenBeans) //"I just ate some Green Beans\n" 
eat(Food.Fruit.Grapes)   //"I just ate some Grapes\n"