2014-06-05 59 views
4

我創建瞭如下的枚舉,並嘗試使用fromRaw()函數。如何使用枚舉的fromRaw()函數

enum Test : Int { 
    case a = 1 
    case b, c 
    func description() -> String{ 
     switch self { 
     case .a: 
      return "a" 
     default: 
      return String(self.toRaw()) 
     } 
    } 
} 

它適用於我這樣使用的情況。 bvalue.description()給我結果「2」。

if let bvalue = Test.fromRaw(2) { 
    bvalue.description() 
} 

但是,當我嘗試使用它沒有If語句,如下所示。它在第二行給我一個錯誤的通知:「無效的'()'用來調用一個非函數類型字符串的值。」

let bvalue = Test.fromRaw(2) 
bvalue.description() 

我很困惑。 If或If If語句有什麼區別?爲什麼第二種方式無法工作?從()函數返回的是什麼類型?

+0

你能正確地格式化你的代碼,使其更具可讀性嗎? –

+0

[爲什麼我會使用if和let together,而不是僅僅檢查原始變量是否爲零? (Swift)](http://stackoverflow.com/questions/24049377/why-would-i-use-if-and-let-together-instead-of-just-checking-if-the-original-va) – Chuck

回答

2

.fromRaw()方法返回一個可選的枚舉值。因此,代替bvalue,其類型爲Test,它的類型爲Test?。爲了訪問它的價值,你需要或者有if let...喜歡你解開例子,或強制解纏與!操作:

bvalue!.description() 

注意,如果.fromRaw()調用失敗,你會得到一個運行時錯誤。試試這個,看看它:

let bvalue = Test.fromRaw(5) // 5 is out of bounds, bvalue == nil 
bvalue!.description()   // runtime error: Can't unwrap Optional.None 
+1

請注意,'fromRaw()'不再是Swift語言的一部分。相反,現在使用failable初始化器,如下所示:'if let bvalue = Test(rawValue:2){...}從'(')'' –

+0

'已折舊;更新答案。 – Zorayr

0

區別在於,您發佈的第二個片段bvalue是可選的。這意味着bvalue變量的可能值是nil。使用if語句「解包可選」爲零或原始值。你可以閱讀更多關於這個here

0

fromRaw()函數返回一個可選的枚舉,你的情況Test?,其中可能包含Testenum,或者是nil

在此之前使用它,你必須解開它,這是你在用做什麼if-let模式

如果您嘗試直接訪問說明,則會導致編譯器錯誤。

您也可以使用!運算符強制展開可選值,如bvalue!.description中所述。但是,只有在明確表示Optional包含實際值並且不是nil的情況下,才應該使用它。在值爲nil的情況下使用它會導致運行時錯誤。

7

注意fromRaw()不再存在。新的用法是:

Test(rawValue: 2)