2017-07-19 69 views
0

[任意]說我有字符串類型,enum1的5個不同的枚舉:字符串,enum2:字符串...GET枚舉從原始值,而不會向下轉換

我有一個數組[任意],其類型爲的一個5枚舉,有沒有辦法獲得枚舉數組的原始值而不將其向下轉換爲特定的枚舉類型?

+2

不,除非編譯器知道枚舉類型,否則無法完成。所以downcast是必須的 – kathayatnk

+0

我同意@kathayatnk,因爲根據[蘋果的Swift文檔](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html):'任何可以表示任何類型的實例,包括函數類型'。因此,如果您不讓編譯器知道您正在使用枚舉,您將無法獲得枚舉個案的原始值。 –

+0

如果你不想向下傾斜,你爲什麼要使用Any? –

回答

0

是的,你可以這樣做:

Enum(rawValue:INDEX) 

因此,舉例來說,如果你有一個貨幣枚舉:

public enum Currency : Int { 

case EUR 
case GBP 
case SK 
case NOK 
case USD 

public static let values : [Currency] = [EUR, GBP, SK, NOK, USD] 

}

你可以得到這樣的價值:

Currency(rawValue: 0) 

它會退還EUR。

+0

似乎你的答案與問題無關。 –

0

您可以創建一個新的枚舉類型來保存其他枚舉值,而不是將不同的枚舉包裝在任何數組中。所以你總是輸入安全的,並有機會獲得原始價值。

enum Enum1: String { 
    case foo1 = "foo" 
    case foo2 = "foo2" 
} 

enum Enum2: String { 
    case bla1 = "bla" 
    case bla2 = "bla2" 
} 


enum EnumType { 
    case enum1(Enum1) 
    case enum2(Enum2) 
    case enum3(Enum2) 
} 

let array: [EnumType] = [ 
    EnumType.enum1(.foo1), 
    EnumType.enum1(.foo2), 
    EnumType.enum2(.bla1)] 

for item in array { 
    switch item { 
    case .enum1(let value): 
     print(value) 
    case .enum2(let value): 
     print(value) 
    case .enum3(let value): 
     print(value) 
    } 
}