Swift 枚举和结构
枚举
使用enum
创建枚举——注意 Swift 的枚举可以关联方法:
1 enum Rank: Int {
2 case Ace = 1 case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
3 case Jack, Queen, King
4 func simpleDescription () -> String {
5 switch self {
6 case .Ace:
7 return "ace" case .Jack:
8 return "jack" case .Queen:
9 return "queen" case .King:
10 return "king" default:
11 return String (self.toRaw ())
12 }
13 }
14 }
15 let ace = Rank.Ace
16 let aceRawValue = ace.toRaw ()
使用toRaw
和fromRaw
在原始(raw)数值和枚举值之间进行转换:
1 if let convertedRank = Rank.fromRaw (3) {
2 let threeDescription = convertedRank.simpleDescription ()
3 }
注意枚举中的成员值(member value)是实际的值(actual value),和原始值(raw value)没有必然关联。
一些情况下枚举不存在有意义的原始值,这时可以直接忽略原始值:
1 enum Suit {
2 case Spades, Hearts, Diamonds, Clubs
3 func simpleDescription () -> String {
4 switch self {
5 case .Spades:
6 return "spades" case .Hearts:
7 return "hearts" case .Diamonds:
8 return "diamonds" case .Clubs:
9 return "clubs"
10 }
11 }
12 }
13 let hearts = Suit.Hearts
14 let heartsDescription = hearts.simpleDescription ()
除了可以关联方法,枚举还支持在其成员上关联值,同一枚举的不同成员可以有不同的关联的值:
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)." case let .Error (error):
12 let serverResponse = "Failure... \(error)"
13 }
结构
Swift 使用struct
关键字创建结构。结构支持构造器和方法这些类的特性。结构和类的最大区别在于:结构的实例按值传递(passed by value),而类的实例按引用传递(passed by 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 ()