Swift中文教程(六)枚舉和結構

來源:互聯網
上載者:User

Enumerations 枚舉

使用 enum 來建立一個枚舉。跟Classes(類)和其他類型的命名方式一樣,枚舉也可以有Method(方法)。

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.toRaw())          }      }  }  let ace = Rank.Ace  let aceRawValue = ace.toRaw()

練習:

建立一個函數,通過原始值的類比來比較兩個rank的值。

在上例中,原始值的類型是 Int ,所以你可以只指定第一個原始值就可以了,因為後面的原始值都是按照順序賦值的。你還也可以使用字串或浮點數作為枚舉的原始值。

使用toRaw和fromRaw函數可以實現原始值和枚舉值間的轉換:

1 if let convertedRank = Rank.fromRaw(3) {
2     let threeDescription = convertedRank.simpleDescription()
3 }

枚舉出來的值就是實際值,而不是其他方式寫的原始值。(這句話的意思應該就是說枚舉值和原始值沒有必然的關聯性)為了防止枚舉無意義的原始值,你不需要特意提供一個原始值:

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”。

查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

請注意上例中引用hearts成員的兩種方式:當給常量hearts賦值時,Suit.Hearts是全名引用,因為此時的常量hearts沒有一個明確的類型。而在switch內部,枚舉通過縮減形式:.Hearts來引用,因為 self 的值對於枚舉成員是已知的。當值的類型已知時,你可以隨時使用縮減形式(去引用)。

Structures 結構

使用struct關鍵字建立來建立結構。結構體支援類(Classes)的許多行為:如,方法(methods)和構造器(initializers)。結構體與類最重要的區別是,在代碼中,結構體通過拷貝(copy)來實現值的傳遞,而類則是通過引用(reference):

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的組合。

一個枚舉成員的執行個體可以擁有執行個體的值。相同枚舉成員的執行個體可以有不同的值。你在建立執行個體時可以給它指定一個值。指定值和原始值的區別在於:枚舉的原始值與所有執行個體相同,原始值是你在定義枚舉時提供的。

例如:有一個情境,需要你從伺服器中請求太陽升起和降落的時間,伺服器可以響應給你相應的資訊,也能給你返回錯誤的資訊:

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)://請求錯誤時返回的資訊--Joe.Huang      let serverResponse = "Failure...  \(error)"}

練習:

在switch語句裡給ServerResponse添加第三種情況(case)。

請注意:(上例中)ServerResponse所返回的日出與日落時間是switch中所匹配的情況(case)。

作者:cnblogs Joe.Huang

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.