簡體   English   中英

保存任何枚舉String類型的Swift數組

[英]Swift array holding any enum String type

我如何在Swift中聲明一個數組,它可以保存任何enum String類型的值?

這就是我想要做的事情:

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之前鍵入check每個元素,這也不是很好。

目前我只能在這個項目中使用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] = ...不會讓事情變得更糟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM