Arrays 包含任何枚举字符串类型的Swift数组

Arrays 包含任何枚举字符串类型的Swift数组,arrays,swift,enums,Arrays,Swift,Enums,如何在Swift中声明一个数组,该数组可以保存任何enum字符串类型的值 以下是我想做的: enum MyEnumType1: String { case Foo = "foo" case Bar = "bar" } enum MyEnumType2: String { case Baz = "baz" } // ... // Compiler error: "Type of expression is ambiguous without more context"

如何在Swift中声明一个数组,该数组可以保存任何
enum
字符串类型的值

以下是我想做的:

enum MyEnumType1: String {
    case Foo = "foo"
    case Bar = "bar"
}

enum MyEnumType2: String {
    case Baz = "baz"
}

// ...

// Compiler error: "Type of expression is ambiguous without more context"
var myArray = [ MyEnumType1.Bar, MyEnumType2.Baz ] 
//         ^ need to declare type here, but not sure of correct syntax 

// pass array over to a protocol which will iterate over the array accessing .rawValues
这两个枚举类型松散相关,但绝对不同,在本例中我需要将值分开,因此将它们集中在一个枚举中并声明MyAllIncludingEnumType类型的数组是不可取的

或者我应该声明一个字符串数组并直接添加值吗

我可以将数组声明为
[AnyObject]
,但在尝试访问
.rawValue
之前,我必须先键入check每个元素,这也不太好

目前我只能在这个项目上使用Swift 1.2,因为它是针对已经在应用商店中的应用程序的,我需要能够在Xcode 7上市之前发布更新


或者,对于我想做的事情,是否有一个更干净但完全替代的解决方案?

如果您只使用数组来检索其元素的rawValue,那么您可以简单地将rawValue存储在数组中:

var myArray = [ MyEnumType1.Bar.rawValue, MyEnumType2.Baz.rawValue ]

相反,如果您想从数组中检索原始枚举,那么您仍然需要键入check元素,因此
var myArray:[Any]=…
不会让事情变得更糟。

请尝试下面的代码

enum MyEnumType1: String {
case Foo = "foo"
case Bar = "bar"
}

enum MyEnumType2: String {
case Baz = "baz"
}

var myArray: [Any] = [ MyEnumType1.Bar, MyEnumType2.Baz ]

只要从逻辑上考虑一下:您希望在一个数组中存储多个枚举,因此它可以是这个枚举,也可以是那个枚举,这正是枚举的含义!您可以声明一个新枚举,该枚举具有所有接受的其他枚举的关联值,如下所示:

enum A {
    case A1, A2
}

enum B {
    case B1, B2
}

enum All {
    case First(A)
    case Second(B)
}
然后您可以创建一个如下所示的数组:

let array : [All] = [
    .First(.A1),
    .Second(.B2),
    .Second(.B1),
    .First(.A1)
]

Kametrixom答案的另一种选择是使两个枚举都符合公共协议。由于
字符串的原始值
,两者都自动符合:

protocol RawRepresentable {
    typealias RawValue
    var rawValue: RawValue { get }
    ...
}
但是,您不能将其用作存储在数组中的类型,因为
RawRepresentable
是一个通用协议。相反,你可以做:

protocol StringRepresentable {
    var rawValue: String { get }
}

enum EnumA: String, StringRepresentable {
    case A = "A"
}

enum EnumB: String, StringRepresentable {
    case B = "B"
}

let array: [StringRepresentable] = [EnumA.A, EnumB.B]
array[0].rawValue // A

类似于枚举。我喜欢。