Swift之旅(五)枚舉與結構體

來源:互聯網
上載者:User

標籤: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之旅(五)枚舉與結構體

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.