枚举和结构体
用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.Ace
let aceRawValue = ace.rawValue
练习
写一个函数通过比较Rank的原始值比较两个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.Hearts
let heartDescription = hearts.simpleDescription()
练习
为Suit添加一个color()方法,Spades,Clubs返回“black”,Hearts,Diamonds返回“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 threeOfSpadesDscription = 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 failure {
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的case中匹配。