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