2014-06-08 60 views
0

在Apple的快速書中,有一個枚舉示例。它可以讓你將一個原始的Int轉換爲一個枚舉排名。然而,當我嘗試刪除if語句,代碼給我爲什麼這需要執行if語句

Playground execution failed: error: :30:13: error: 'Rank?' does not have a member named 'simpleDesciption'

enum Rank: Int { 
    case Ace = 1 
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten 
    case Jack, Queen, King 

    func simpleDesciption() -> String { 
     switch self { 
      case .Ace: 
       return "ace" 
      case .Jack: 
       return "jack" 
      case .Queen: 
       return "queen" 
      case .King: 
       return "king" 
      default: 
       return String(self.toRaw()) 
     } 
    } 
} 

if let convertedRank = Rank.fromRaw(1){ 
    let threeDescription = convertedRank.simpleDesciption() 
} 

// Why does it need to be wrapped in a if statement? 

let convertedRank = Rank.fromRaw(1) 
let threeDescription = convertedRank.simpleDesciption() 

回答

2

if let結構允許解開一個可選類型。 Rank.fromRaw返回Rank?可選類型,這意味着它可以是nil或該類型的實際值。

有兩種方法可以在Swift中打開可選類型的值,其中之一是if let構造。如果可選類型不是nil,並且if let後面的變量被綁定到其值(因此具有類型Rank而不是Rank?),則會執行if let的主體。

請注意,如果你只是寫let convertedRank = Rank.fromRaw(1)沒有ifconvertedRank有型Rank?,並再次,不能直接用作Rank沒有被解開。

如果確保,該值永遠不會nil,您可以通過!後面添加變量名強行解開它:

let convertedRank = Rank.fromRaw(1) 
convertedRank!.simpleDescription() 

但不建議這樣做的風格,因爲它如果未定義該值,則會在運行時失敗。

+0

這是可選的類型,以防止錯誤,通過檢查如果convertedRank實際上有一個值? –

+0

是的,正是...... –