如何将不同的枚举类型传递给同一个变量,稍后标识其类型并使用其原始值执行一些操作?Swift - 将相同变量的不同枚举类型传递给一个类
我有两个枚举Menu1
和Menu2
类型的字符串。我喜欢将一组枚举传递给显示子菜单的另一个类。我喜欢将enum传递给相同的变量,因为我可能会在未来添加另一个菜单。
如何将不同的枚举类型传递给同一个变量,稍后标识其类型并使用其原始值执行一些操作?Swift - 将相同变量的不同枚举类型传递给一个类
我有两个枚举Menu1
和Menu2
类型的字符串。我喜欢将一组枚举传递给显示子菜单的另一个类。我喜欢将enum传递给相同的变量,因为我可能会在未来添加另一个菜单。
对于应用的抽象,你可以使用,如下:
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?
...
}
您应该使用条件绑定(如果让menuArray = menuArray作为[Menu1] ...')而不是'is' +'as!' – Alexander
哦,多么愚蠢的错误! @亚历山大感谢您的注意:)编辑。 –
您可以声明一个协议,即两个枚举应符合。 现在接受您的功能参数确认到协议。或者,您可以使用泛型。
如果您能够为上述可能性显示示例,那将会有所帮助。我对swift很陌生,对枚举的泛型和协议知之甚少 – prabhu
您需要一种方法来连接两个枚举,这可能是一个常见的协议。你将遇到的问题是类型擦除涉及传递对象周围的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)
这种方法的主要优点:
这两个枚举不能被杵状并形成单枚枚举吗? – Priyal
'Any'可能会有所帮助,但是您需要将其重新转换为您的'enum'类型。 – Lawliet
没有。因为枚举值很高,所以我喜欢保持它的不同。 – prabhu