Swift - 如何使用不同类型的枚举声明/的变量/功能?

时间:2016-08-18 21:40:54

标签: ios swift generics enums protocols

我需要声明变量,它将存储不同类型的枚举数组,例如:

var enums = [EnumTypeA.Option1, EnumTypeB.Option2]

编译器状态:

  

如果没有更多的上下文,表达的类型是不明确的

将任何枚举或其他对象作为函数参数传递是必要的。但是我发现我可以通过泛型实现这一点,例如:

func f1<T>(enum: T)

但是带有可选方法的协议(以@objc为前缀)是不可能的。

2 个答案:

答案 0 :(得分:2)

您可以使用协议......

protocol MyEnums {}

enum MyEnum1: MyEnums {
    case first, second
}

enum MyEnum2: MyEnums {
    case red, green
}

let myArray: [MyEnums] = [MyEnum1.first, MyEnum2.green]

func myFunc(myEnum: MyEnums) {
    print(myEnum)
}

for value in myArray {
    myFunc(myEnum: value)
}

答案 1 :(得分:1)

这很有趣。我只是选择了Any而不是泛型,因为那是一切的基础。

enum TypeA {
    case Option1
    case Option2
}

enum TypeB {
    case Option1
    case Option2
}

func acceptDifferentEnums(value: Any) {
    switch value {
    case let typeA as TypeA:
        print("This is TypeA")
    case let typeB as TypeB:
        print("This is typeB")
    default:
        print("This is something else")
    }
}


acceptDifferentEnums(TypeA.Option1) // This is TypeA
acceptDifferentEnums(TypeB.Option2) // This is TypeB
acceptDifferentEnums("Foo") // This is something else

然后使用switch语句将value属性向下转换为各种枚举,并相应地处理它们。