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

 

Enumerations 枚舉git

 

使用 enum 來建立一個枚舉。跟Classes(類)和其餘類型的命名方式同樣,枚舉也能夠有Method(方法)。github

 1 enum Rank: Int {
 2     case Ace = 1
 3     case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
 4     case Jack, Queen, King
 5     func simpleDescription() -> String {
 6         switch self {
 7         case .Ace:
 8             return "ace"
 9         case .Jack:
10             return "jack"
11         case .Queen:
12             return "queen"
13         case .King:
14             return "king"
15         default:
16             return String(self.toRaw())
17         }
18     }
19 }
20 let ace = Rank.Ace
21 let aceRawValue = ace.toRaw()

練習:服務器

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

在上例中,原始值的類型是 Int ,因此你能夠只指定第一個原始值就能夠了,由於後面的原始值都是按照順序賦值的。你還也能夠使用字符串或浮點數做爲枚舉的原始值。函數

使用toRaw和fromRaw函數能夠實現原始值和枚舉值間的轉換:ui

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

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

 1 enum Suit {
 2     case Spades, Hearts, Diamonds, Clubs
 3     func simpleDescription() -> String {
 4         switch self {
 5         case .Spades:
 6             return "spades"
 7         case .Hearts:
 8             return "hearts"
 9         case .Diamonds:
10             return "diamonds"
11         case .Clubs:
12             return "clubs"
13         }
14     }
15 }
16 let hearts = Suit.Hearts
17 let heartsDescription = hearts.simpleDescription()

練習:code

給枚舉Suit建立一個名爲color的方法,讓Spades和Clubs返回「black」,讓Hearts和Diamonds返回「red」。server

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

 

Structures 結構

 

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

1 struct Card {
2     var rank: Rank
3     var suit: Suit
4     func simpleDescription() -> String {
5         return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
6     }
7 }
8 let threeOfSpades = Card(rank: .Three, suit: .Spades)
9 let threeOfSpadesDescription = threeOfSpades.simpleDescription()

練習:

添加一個Card方法來建立一副紙牌,每一張牌都含有一個Rank和Suit的組合。

一個枚舉成員的實例能夠擁有實例的值。相同枚舉成員的實例能夠有不一樣的值。你在建立實例時能夠給它指定一個值。指定值和原始值的區別在於:枚舉的原始值與全部實例相同,原始值是你在定義枚舉時提供的。

例如:有一個場景,須要你從服務器中請求太陽升起和降落的時間,服務器能夠響應給你相應的信息,也能給你返回錯誤的信息:

 1 enum ServerResponse {
 2     case Result(String, String)
 3     case Error(String)
 4 }
 5  
 6 let success = ServerResponse.Result("6:00 am", "8:09 pm")
 7 let failure = ServerResponse.Error("Out of cheese.")
 8  
 9 switch success {
10 case let .Result(sunrise, sunset):
11     let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
12 case let .Error(error)://請求錯誤時返回的信息--Joe.Huang
13     let serverResponse = "Failure...  \(error)"
14 }

練習:

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

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

 

謝謝,Swifter-QQ羣:362232993,同好者進~ 

github地址:https://github.com/Joejo/Swift-lesson-for-chinese

相關文章
相關標籤/搜索