2015-08-27 90 views
1

如何在Swift中聲明一個數組,可以保存任何enum字符串類型的值?Swift數組中保存任何枚舉字符串類型

這就是我想做的事:

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類型的數組是不可取的。

或者我應該只聲明一個字符串數組並直接添加rawValues?

我可以聲明數組爲[AnyObject],但是在嘗試訪問.rawValue之前,我必須鍵入檢查每個元素,這也不是很好。

目前我只能在這個項目中使用Swift 1.2,因爲它已經在App Store中,而且我需要能夠在Xcode 7開始GM之前發佈更新。

還是有一個更乾淨但完全替代的解決方案,我想要做什麼?

回答

4

試想一下邏輯:你想多枚舉存儲在數組中,因此它可以是這樣或那樣的枚舉,這僅僅是一個枚舉是什麼!你可以聲明具有相關聯的所有接受的其他枚舉值,像這樣一個新的枚舉:

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

類似於啓動的枚舉。我喜歡。 –

0

如果您使用數組只檢索其元素的rawValues,那麼你可能只是rawValues存儲陣列中:

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

相反,如果你想從該數組檢索原來的枚舉,那麼你將需要鍵入檢查元素,所以var myArray: [Any] = ...不會讓事情變得更糟。

1

試試下面的代碼

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

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

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

到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 
+0

好的替代解決方案 - 感謝您的洞察力並花時間分享它。 –