枚舉和結構體

使用enum來建立一個枚舉。就像類和其餘全部命名類型同樣,枚舉能夠包含方法。javascript

enum Rank: Int {
    case Ace = 1 case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten case Jack, Queen, King 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.rawValue) } } } let ace = Rank.Ace let aceRawValue = ace.rawValue

練習: 寫一個函數,經過比較它們的原始值來比較兩個Rank值。java

在上面的例子中,枚舉原始值的類型是Int,因此你只須要設置第一個原始值。剩下的原始值會按照順序賦值。你也可使用字符串或者浮點數做爲枚舉的原始值。使用rawValue屬性來訪問一個枚舉成員的原始值。swift

使用init?(rawValue:)初始化構造器在原始值和枚舉值之間進行轉換。服務器

if let convertedRank = Rank(rawValue: 3) { let threeDescription = convertedRank.simpleDescription() }

枚舉的成員值是實際值,並非原始值的另外一種表達方法。實際上,以防原始值沒有意義,你不須要設置。函數

enum Suit { case Spades, Hearts, Diamonds, Clubs func simpleDescription() -> String { switch self { case .Spades: return "spades" case .Hearts: return "hearts" case .Diamonds: return "diamonds" case .Clubs: return "clubs" } } } let hearts = Suit.Hearts let heartsDescription = hearts.simpleDescription()

練習: 給Suit添加一個color()方法,對spadesclubs返回「black」,對heartsdiamonds返回「red」。ui

注意,有兩種方式能夠引用Hearts成員:給hearts常量賦值時,枚舉成員Suit.Hearts須要用全名來引用,由於常量沒有顯式指定類型。在switch裏,枚舉成員使用縮寫.Hearts來引用,由於self的值已經知道是一個suit。已知變量類型的狀況下你可使用縮寫。spa

使用struct來建立一個結構體。結構體和類有不少相同的地方,好比方法和構造器。它們之間最大的一個區別就是結構體是傳值,類是傳引用。code

struct Card { var rank: Rank var suit: Suit func simpleDescription() -> String { return "The \(rank.simpleDescription()) of \(suit.simpleDescription())" } } let threeOfSpades = Card(rank: .Three, suit: .Spades) let threeOfSpadesDescription = threeOfSpades.simpleDescription()

練習: 給Card添加一個方法,建立一副完整的撲克牌並把每張牌的 rank 和 suit 對應起來。server

一個枚舉成員的實例能夠有實例值。相同枚舉成員的實例能夠有不一樣的值。建立實例的時候傳入值便可。實例值和原始值是不一樣的:枚舉成員的原始值對於全部實例都是相同的,並且你是在定義枚舉的時候設置原始值。three

例如,考慮從服務器獲取日出和日落的時間。服務器會返回正常結果或者錯誤信息。

enum ServerResponse {
    case Result(String, String) case Error(String) } let success = ServerResponse.Result("6:00 am", "8:09 pm") let failure = ServerResponse.Error("Out of cheese.") switch success { case let .Result(sunrise, sunset): let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)." case let .Error(error): let serverResponse = "Failure... \(error)" }

練習: 給ServerResponseswitch添加第三種狀況。

注意如何從ServerResponse中提取日升和日落時間並用獲得的值用來和switch的狀況做比較。

相關文章
相關標籤/搜索