/**
使用 enum 来创建枚举。有如类和其他命名类型,枚举可以有方法。
*/
enum Rank:Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescrition() -> String {
switch self {
case .Ace:
return "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
default:
return String(self.toRaw())
}
}
}
/*
在如上例子中,原始值的类型是 Int 所以可以只指定第一个原始值。其后的原始值都是按照顺序赋值的。也可以使用字符串或浮点数作为枚举的原始值。
使用 toRaw 和 fromRaw 函数可以转换原始值和枚举值。
if let convertedRank = Rank.fromRaw(3) {
let threeDescription = convertedRank.simpleDescription()
}
*/
var rank =Rank.Ace
println(rank)
var r1 = rank.simpleDescrition()//ace
var r2 =rank.toRaw()//1
println("\(r1):\(r2)");//ace:1
rank = Rank.Nine
r1 = rank.simpleDescrition()//9
r2 =rank.toRaw();//9
println("\(r1):\(r2)");//9:9
rank = Rank.King
r1 = rank.simpleDescrition()//king
r2 =rank.toRaw();//13
println("\(r1):\(r2)");//king:13
ifvar aa = Rank.fromRaw(3) {
var bb = aa.toRaw()
println(bb)//3
}
//枚举的成员值就是实际值,而不是其他方式写的原始值。实际上,有些情况是原始值,就是你不提供的时候。
println("枚举的成员值就是实际值,而不是其他方式写的原始值。实际上,有些情况是原始值,就是你不提供的时候。");
//下面Spades赋值200,后面依次加1,如果Spades不赋值,那么Spades值默认为1,后面依次加1
enum MYSuit:Int {//指定枚举值默认为Int型
case Spades=200, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case MYSuit.Spades:
return "spades"
case MYSuit.Hearts:
return "hearts"
case MYSuit.Diamonds:
return "dismonds"
case MYSuit.Clubs:
return "clubs"
}
}
}
let h = MYSuit.Hearts //by gashero
println(h.toRaw())//201
let hd = h.simpleDescription()
println(hd)//hearts
enum Suit {//没有指定枚举值的默认类型,所以该枚举不能使用toRaw与fromRaw函数
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "dismonds"
case .Clubs:
return "clubs"
}
}
}
let hearts =Suit.Hearts //by gashero
let heartsDescription =hearts.simpleDescription()
println(heartsDescription)//hearts
//使用 struct 创建结构体。结构体支持多个与类相同的行为,包括方法和构造器。一大重要的区别是代码之间的传递总是用拷贝(值传递),而类则是传递引用。
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return"The \(rank.simpleDescrition()) of\(suit.simpleDescription())"
}
}
let threeOfSpades =Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription =threeOfSpades.simpleDescription()
println(threeOfSpadesDescription)//The 3 of spades
/**添加方法到 Card类来创建一桌的纸牌,每个纸牌都有合并的rank和suit。(就是个打字员的活二,by gashero)。
一个枚举的实例成员可以拥有实例的值。相同枚举成员实例可以有不同的值。你在创建实例时赋值。指定值和原始值的区别:枚举的原始值与其实例相同,你在定义枚举时提供原始值。
例如,假设情况需要从服务器获取太阳升起和降落时间。服务器可以响应相同的信息或一些错误信息。
**/
enum ServerResponse {
case r(String, String)//??
case e(String)//??
}
let s = ServerResponse.r("6:00 am","8:09 pm")
let f = ServerResponse.e("Out of cheese.")
switch s {
case let .r(sr, sset):
let serverResponse ="Sunrise is at \(sr) and sunset is at \(sset)."
println(serverResponse)//Sunrise is at 6:00 am and sunset is at 8:09 pm.
case let .e(err):
let serverResponse = "Failure... \(err)"
println(serverResponse)
}
switch f {
caselet .r(sr, sset):
let serverResponse ="Sunrise is at \(sr) and sunset is at \(sset)."
println(serverResponse)
caselet .e(err):
let serverResponse = "Failure... \(err)"//Failure... Out of cheese.
println(serverResponse)
}