標籤:swift
用 enum 來定義一個枚舉。正如類和其他命名類型一樣,枚舉也可以有關聯的方法。
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.Acelet aceRawValue = ace.rawValue
試一試
寫一個函數,通過比較rawValue的值類比較兩個Rank的值。
在上面的例子裡,枚舉裡的原生實值型別是Int,所以你只需指定第一個原生值就可以了。其餘的原生值會依序被指定。你還可以用字串和浮點數作為枚舉的原生類型。使用rawValue屬性來訪問枚舉成員的原生值。
使用 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.Heartslet heartsDescription = hearts.simpleDescription()
試一試
在Suit裡加一個 color() 方法,梅花和黑桃就返回“black“,紅桃和方塊就返回“red“。
注意上例中枚舉成員Hearts被引用的兩種方法:當把分配值給hearts常量時,枚舉成員Suit.Hearts 是用全名來引用的,因為常量沒有顯式指定類型。在switch裡枚舉成員以簡寫形式 .Hearts 引用,因為self的值已經知道是個Suit。你可以在實值型別已知的情況下盡情使用簡寫形式。
使用 struct 來定義一個結構體。結構體支援很多和類一樣的行為,包括方法和初始化器。結構體與類的最重要區別就是結構體傳值時都是傳副本,而類都是傳引用。
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裡加一個方法,建立一整套撲克牌,每一張牌都有大小和花色。
枚舉成員的執行個體可以具有與執行個體相關聯的值。同一個枚舉成員的多個執行個體可以有與各自關聯的值。建立執行個體時就給它們賦予關聯值。關聯值與原生值不同:枚舉成員的原生值對它的執行個體來說都是一樣的,在定義枚舉的時候就已經提供原生值了。
例如,考慮這麼一個情境:從伺服器請求日出和日落的時間。伺服器要麼響應資訊要麼返回錯誤。
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裡再加第三個case
注意sunrise和sunset時間是怎麼從ServerResponse值裡提取出來作為switch條件匹配值的一部分的。
Swift之旅(五)枚舉與結構體