2016-04-26 2 views
2

Скажем, у меня есть перечисление вроде этого:Swift перечислений, которые вызывают метод

enum ItemType { 
    case TypeOne 
    case TypeTwo 
    case TypeThree 
} 

Тогда я метод, который вызывает другой метод, основанный на ItemType выбранный:

func getItem(withType: ItemType) { 
    switch withType { 
     case TypeOne: 
      getTypeOneItem() 
     case TypeTwo: 
      getTypeTwoItem() 
     case TypeThree: 
      getTypeThreeItem() 
    } 
} 

Я просто интересно, есть ли лучший способ написать это, если у меня много ItemTypes, оператор switch будет очень грязным.

Не уверен, если это возможно, но может быть, enum, что вызывает метод непосредственно enum xx { case TypeOne: ?? = getTypeOneItem() ...

ответ

2

Простым решением для этого является перечисление как ключ словаря. Предположим, что все они недействительны. Вы можете сделать что-то вроде этого:

import Foundation 

enum ItemType 
{ 
    case TypeOne 
    case TypeTwo 
    case TypeThree 
} 

func getTypeOneItem() -> Void 
{ 
    print("One") 
} 

func getTypeTwoItem() -> Void 
{ 
    print("Two") 
} 

func getTypeThreeItem() -> Void 
{ 
    print("Three") 
} 

// Register all the enum values 
let dict = [ItemType.TypeOne: getTypeOneItem, ItemType.TypeTwo: getTypeTwoItem, ItemType.TypeThree: getTypeThreeItem] 

// Fetch 
let function1 = dict[ItemType.TypeOne]! 

function1() // This prints "One" 

Для меня это выглядит чище, чем при использовании переключателя.

1

Вставьте функцию самого перечисления. Вам больше не нужен параметр. Вы даже можете добавить его к типу с static, но это не имеет смысла, так как вам всегда нужна переменная типа ItemType.

func getTypeOneItem() -> Void { 
    print("typeOne") 
} 

func getTypeTwoItem() -> Void { 
    print("typeTwo") 
} 

func getTypeThreeItem() -> Void { 
    print("typeThree") 
} 

enum ItemType { 
    case TypeOne 
    case TypeTwo 
    case TypeThree 

    func getItem() -> Void { 
     switch self { 
     case .TypeOne: 
      getTypeOneItem() 
     case .TypeTwo: 
      getTypeTwoItem() 
     case .TypeThree: 
      getTypeThreeItem() 
     } 
    } 
} 

let item: ItemType = ItemType.TypeOne 
item.getItem() // prints typeOne 
Смежные вопросы