2017-07-26 64 views
0

如何将不同的枚举类型传递给同一个变量,稍后标识其类型并使用其原始值执行一些操作?Swift - 将相同变量的不同枚举类型传递给一个类

我有两个枚举Menu1Menu2类型的字符串。我喜欢将一组枚举传递给显示子菜单的另一个类。我喜欢将enum传递给相同的变量,因为我可能会在未来添加另一个菜单。

+0

这两个枚举不能被杵状并形成单枚枚举吗? – Priyal

+0

'Any'可能会有所帮助,但是您需要将其重新转换为您的'enum'类型。 – Lawliet

+0

没有。因为枚举值很高,所以我喜欢保持它的不同。 – prabhu

回答

1

对于应用的抽象,你可以使用,如下:

protocol Menu {} 

enum Menu1: String, Menu { 
    case option1 = "Option 01 From Menu 01" 
    case option2 = "Option 02 From Menu 01" 
    case option3 = "Option 03 From Menu 01" 
    case option4 = "Option 04 From Menu 01" 
    case option5 = "Option 05 From Menu 01" 
} 

enum Menu2: String, Menu { 
    case option1 = "Option 01 From Menu 02" 
    case option2 = "Option 02 From Menu 02" 
    case option3 = "Option 03 From Menu 02" 
    case option4 = "Option 04 From Menu 02" 
    case option5 = "Option 05 From Menu 02" 
} 

通过实现这一点,你能申报Menu类型的数组,其中既包括枚举:

let myMenu1Array: [Menu1] = [.option1, .option2, .option5] 
let myMenu2Array: [Menu2] = [.option1, .option3, .option4] 

例如,将参数设置为Menu s的函数应该可以工作:

func handleMenu(_ menuArray: [Menu]) { 
    if let menu1Array = menuArray as? [Menu1] { 
     print("Menu 1 Detected!") 

     // you could iterate through it for instance... 
     for option in menu1Array { 
      print(option.rawValue) 
     } 

     return 
    } 

    if let menu2Array = menuArray as? [Menu2] { 
     print("Menu 2 Detected!") 

     // you could iterate through it for instance... 
     for option in menu2Array { 
      print(option.rawValue) 
     } 

     return 
    } 
} 

输出将是:

handleMenu(myMenu1Array) 
/* 
Menu 1 Detected! 
Option 01 From Menu 01 
Option 02 From Menu 01 
Option 05 From Menu 01 
*/ 

handleMenu(myMenu2Array) 
/* 
Menu 2 Detected! 
Option 01 From Menu 02 
Option 03 From Menu 02 
Option 04 From Menu 02 
*/ 

所以,如果你有这应该代表的是菜单一类的属性,你可以声明为一个类型的Menu

class MyClass { 
    ... 

    var menu: Menu? 

    ... 
} 
+0

您应该使用条件绑定(如果让menuArray = menuArray作为[Menu1] ...')而不是'is' +'as!' – Alexander

+0

哦,多么愚蠢的错误! @亚历山大感谢您的注意:)编辑。 –

1

您可以声明一个协议,即两个枚举应符合。 现在接受您的功能参数确认到协议。或者,您可以使用泛型。

+0

如果您能够为上述可能性显示示例,那将会有所帮助。我对swift很陌生,对枚举的泛型和协议知之甚少 – prabhu

1

您需要一种方法来连接两个枚举,这可能是一个常见的协议。你将遇到的问题是类型擦除涉及传递对象周围的Menu。添加新菜单类型非常容易,并且不会在代码中的任何地方检查它。

我建议一个小的重构,将每个包装到另一个枚举中,由一个公共结构管理。

enum Menu1: String { 
    case option1 = "Option 01 From Menu 01" 
    case option2 = "Option 02 From Menu 01" 
    case option3 = "Option 03 From Menu 01" 
    case option4 = "Option 04 From Menu 01" 
    case option5 = "Option 05 From Menu 01" 
} 

enum Menu2: String { 
    case option1 = "Option 01 From Menu 02" 
    case option2 = "Option 02 From Menu 02" 
    case option3 = "Option 03 From Menu 02" 
    case option4 = "Option 04 From Menu 02" 
    case option5 = "Option 05 From Menu 02" 
} 

struct Menu 
{ 
    enum MenuType 
    { 
     case one (Menu1) 
     case two (Menu2) 
    } 

    let type: MenuType 
} 


func handle(menu: Menu) 
{ 
    switch menu.type 
    { 
    case .one(let data): print (data.rawValue) 
    case .two(let data): print (data.rawValue) 
    } 
} 

let menu = Menu(type: .one(Menu1.option1)) 
handle(menu: menu) 

这种方法的主要优点:

  1. 您可以随意保持添加菜单
  2. 任何时候你添加新的菜单类型,在你的代码中的所有开关语句将在编译踢并显示您需要更新代码的位置
  3. 新菜单的关联数据类型可以是任何东西(结构,图像,嵌套子菜单等)
  4. 没有optionals - onl y具体类型
相关问题