2016-03-23 66 views
28

我試圖從原材料價值得到枚舉類型:如何從Swift的原始值中枚舉enum?

enum TestEnum: String { 
    case Name 
    case Gender 
    case Birth 

    var rawValue: String { 
     switch self { 
     case .Name: return "Name" 
     case .Gender: return "Gender" 
     case .Birth: return "Birth Day" 
     } 
    } 
} 

let name = TestEnum(rawValue: "Name")  //Name 
let gender = TestEnum(rawValue: "Gender") //Gender 

但似乎rawValue不字符串用空格工作:

let birth = TestEnum(rawValue: "Birth Day") //nil 

任何建議如何得到它?

+0

請看看這個:[http://stackoverflow.com/a/38390421/3024579](http://stackoverflow.com/a/38390421/3024579) – Alok

回答

56

太複雜了,乾脆直接指定原始值的情況下

enum TestEnum: String { 
    case Name = "Name" 
    case Gender = "Gender" 
    case Birth = "Birth Day" 
} 

let name = TestEnum(rawValue: "Name")!  //Name 
let gender = TestEnum(rawValue: "Gender")! //Gender 
let birth = TestEnum(rawValue: "Birth Day")! //Birth 

如果案件名稱的原始值相匹配,你甚至可以忽略它

enum TestEnum: String { 
    case Name, Gender, Birth = "Birth Day" 
} 

在斯威夫特3+所有案件的枚舉是lowercased

+2

除變量'name'等現在是可選項,這不太可能是OP想要的。 – matt

+2

沒有其他辦法,比接收可選的(除非你想崩潰,當一個字符串通過,這不對應於枚舉的情況下)。 –

+0

@matt - 對,但由於您在編譯時知道案例名稱,因此您可以安全地打開可選項。我編輯了答案。 – vadian

2

你可以define enum這樣 -

enum TestEnum: String { 
    case Name, Gender, Birth 
} 

OR

enum TestEnum: String { 
    case Name 
    case Gender 
    case Birth 
} 

可以提供一種INIT方法,其默認到成員值中的一個。

enum TestEnum: String { 
    case Name, Gender, Birth 

    init() { 
     self = .Gender 
    } 
} 

在上面的例子,TestEnum.Name具有「名稱」的隱式原始值,依此類推。

let testEnum = TestEnum.Name.rawValue 
// testEnum is "Name" 
let testEnum1 = TestEnum() 
// testEnum1 is "Gender" 
7

全部工作示例:

enum TestEnum: String { 
    case name = "A Name" 
    case otherName 
    case test = "Test" 
} 

let first: TestEnum? = TestEnum(rawValue: "A Name") 
let second: TestEnum? = TestEnum(rawValue: "OtherName") 
let third: TestEnum? = TestEnum(rawValue: "Test") 

print("\(first), \(second), \(third)") 

所有這些都將工作,但使用原始值,它初始化時

您擁有rawValue屬性來訪問枚舉案件的原始值將是一個可選項。如果這是一個問題,您可以爲枚舉創建一個初始化程序或構造函數來嘗試並處理它,如果無法創建枚舉,則添加一個none大小寫並返回它。事情是這樣的:

static func create(rawValue:String) -> TestEnum { 
     if let testVal = TestEnum(rawValue: rawValue) { 
      return testVal 
     } 
     else{ 
      return .none 
     } 
    } 
+0

'init(_ str:String){self = TestEnum(rawValue:str)?? .none}' 作爲一個額外的初始化進行相同的操作 – bbjay

+0

這是另一種選擇。就我個人而言,如果可能的話,我寧願避免使用相同的類型化參數。 – PeejWeej