保存任何enum String类型的Swift数组



我如何在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

这两种枚举类型是松散相关的,但绝对不同,我需要在这个实例中保持值分开,所以将它们集中在一个枚举中并声明myallinclingenumtype类型的数组是不可取的。

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

我可以将数组声明为[AnyObject],但在尝试访问.rawValue之前,我必须对每个元素进行类型检查,这也不是很好。

目前我只能在这个项目中使用Swift 1.2,因为它是一个已经在app Store中的应用程序,我需要能够在Xcode 7进入GM之前发布更新。

或者有一个更干净但完全替代我想做的解决方案吗?

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

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

从逻辑上考虑:你想在一个数组中存储多个枚举,所以它可以是这个或那个枚举,这就是枚举的含义!您可以声明一个新的枚举,它包含所有可接受的其他枚举的关联值,如下所示:

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)
]

尝试以下代码

enum MyEnumType1: String {
case Foo = "foo"
case Bar = "bar"
}
enum MyEnumType2: String {
case Baz = "baz"
}
var myArray: [Any] = [ MyEnumType1.Bar, MyEnumType2.Baz ]

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

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

如果您想从数组中检索原始枚举,那么您将需要对元素进行类型检查,因此var myArray: [Any] = ...不会使事情变得更糟。

相关内容

  • 没有找到相关文章

最新更新