使用enum
来建立一个枚举。就像类和其余全部命名类型同样,枚举能够包含方法。javascript
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.Ace let aceRawValue = ace.rawValue
练习: 写一个函数,经过比较它们的原始值来比较两个
Rank
值。java
在上面的例子中,枚举原始值的类型是Int
,因此你只须要设置第一个原始值。剩下的原始值会按照顺序赋值。你也可使用字符串或者浮点数做为枚举的原始值。使用rawValue
属性来访问一个枚举成员的原始值。swift
使用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.Hearts let heartsDescription = hearts.simpleDescription()
练习: 给
Suit
添加一个color()
方法,对spades
和clubs
返回“black”,对hearts
和diamonds
返回“red”。ui
注意,有两种方式能够引用Hearts
成员:给hearts
常量赋值时,枚举成员Suit.Hearts
须要用全名来引用,由于常量没有显式指定类型。在switch
里,枚举成员使用缩写.Hearts
来引用,由于self
的值已经知道是一个suit
。已知变量类型的状况下你可使用缩写。spa
使用struct
来建立一个结构体。结构体和类有不少相同的地方,好比方法和构造器。它们之间最大的一个区别就是结构体是传值,类是传引用。code
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 对应起来。server
一个枚举成员的实例能够有实例值。相同枚举成员的实例能够有不一样的值。建立实例的时候传入值便可。实例值和原始值是不一样的:枚举成员的原始值对于全部实例都是相同的,并且你是在定义枚举的时候设置原始值。three
例如,考虑从服务器获取日出和日落的时间。服务器会返回正常结果或者错误信息。
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
添加第三种状况。
注意如何从ServerResponse
中提取日升和日落时间并用获得的值用来和switch
的状况做比较。