使用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()
方法,對spades
和clubs
返回「black」,對hearts
和diamonds
返回「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)" }
練習: 給
ServerResponse
和switch
添加第三種狀況。
注意如何從ServerResponse
中提取日升和日落時間並用獲得的值用來和switch
的狀況做比較。