2014-06-15 116 views
3

我一直在下面我的代碼行收到錯誤:「排名」Swift:'Rank?沒有名爲'simpleDescription'的成員?

let rank1desc = rank1Conv.simpleDescription(); 
let rank2desc = rank2Conv.simpleDescription(); 

聲稱該沒有名爲'simpleDescription'的成員。我發現這很奇怪,因爲我根據Apple的教程編寫了這些代碼,並且沒有在Rank的任何地方實施和選擇任何東西?暗示我有。我很想知道爲什麼它給了我這個錯誤,以及如果確實存在可選的來源。非常感謝!

這裏是我的代碼:

enum Rank: Int{ 
    case Ace = 1; 
    case Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10; 
    case Jack = 11, Queen = 12, King = 13; 

    func simpleDescription() -> String{ 
     switch self{ 
     case .Ace: 
      return "Ace"; 
     case .Jack: 
      return "Jack"; 
     case .Queen: 
      return "Queen"; 
     case .King: 
      return "King"; 
     default: 
      return String(self.toRaw()) 
     } 
    } 
} 

let ace = Rank.Ace; 
let aceRawValue = ace.toRaw(); 

func compRank(rank1: Int, rank2: Int) -> String{ 
    let rank1Conv = Rank.fromRaw(rank1); 
    let rank2Conv = Rank.fromRaw(rank2) 
    let rank1desc = rank1Conv.simpleDescription(); 
    let rank2desc = rank2Conv.simpleDescription(); 

    if(rank1 > rank2){ 
     return rank1desc; 
    } 
    else if(rank2>rank1){ 
     return rank2desc; 
    } 
    else{ 
     return "They are equal"; 
    } 
} 

compRank(rank1: 3, rank2: 2); 

回答

4

的問題是,fromRaw不產生Rank,而是Rank?(可選Rank類型)。 simpleDescriptionRank的一部分,而不是Rank?。您需要從中提取Rank值(並測試值是否存在)才能訪問simpleDescription

如果你能保證compRank將始終與有效值被調用,修復你的代碼的最簡單方法是通過更換這些線路:本

let rank1Conv = Rank.fromRaw(rank1); 
    let rank2Conv = Rank.fromRaw(rank2) 

...:

let rank1Conv:Rank! = Rank.fromRaw(rank1) 
    let rank2Conv:Rank! = Rank.fromRaw(rank2) 

!告訴編譯器,rank1Conv(和rank2Conv)的類型是可選的,但你保證它確實包含一個值。然後編譯器會讓你像Rank那樣對待它,並根據需要隱式提取值。

但是,這會破壞您使用optionals獲得的安全性。例如,如果使用值(999,888)調用方法,則fromRaw返回的可選值將爲nil,如果嘗試使用它們,則會導致運行時錯誤。你應該重新設計這種方法,以更恰當地利用可選項,我現在太累了。

+0

謝謝@alvin! –

+0

@ JonathanO'Farrell:沒問題! –

相關問題