Arrays 包含任何枚举字符串类型的Swift数组
如何在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"
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
类似于枚举。我喜欢。