- 枚举
使用enum创建一个枚举,像类一样,枚举也可以有方法。
下面定义扑克的点数值:
enum Rank:Int{
case Ace = 1
case Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten
case Jack,Queen,King
func name()->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 aaaa = Rank.Ace
let bbbb = Rank(rawValue: 1)
let cccc = aaaa.rawValue
print(aaaa.name())
此枚举的原始数据类型为Int,只需要指定枚举中首项(case)的值,后面的case的值会以依次增加的方式自动推算出来。你也可以将浮点或字符串作为枚举的原始数据类型。用rawValue属性来取得某个枚举case的原始值。使用初始化方法 init?(rawValue:)(带个“?”表示返回的结果可能是nil) 可以从一个原始值创建一个枚举实例。比如上面的bbbb。算式aaaa==bbbb的结果会是true(Swift中的Bool型的值是true和false,而不是YES和NO)。
一个枚举各case的值都是真实的值,并不是用于表示原始值的另外一种写法,如果某个case没有有意义的原始值,就不要提供它。
下面这个枚举定义了扑克的花色:
enum Suit{
case Spades,Hearts,Diamonds,Clubs
func name()->String{
switch self{
case Suit.Spades:
return "Spades"
case .Hearts:
return "Heart"
case .Diamonds:
return "Diamonds"
case .Clubs:
return "Clubs"
}
}
}
let hearts = Suit.Hearts
我们可以看到switch语句里,枚举项的访问可以省掉前面的类型名,这个得看情况,只有能推断出来的时候才可以省略,省略时只要一个点就可以了。
枚举的一个case实例可以带上附加的数据。同一个case的不同实例可以带着不同的附加数据。附加数据与原始数据不一样,同一个case的不同实例,它们的原始数据都一样,并且原始数据是在定义枚举时就定死了。
例如,从服务器获取日出和日落时间。服务器可以返回时间或返回错误信息,定义一个枚举:
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):
print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .Error(error):
print("Failuer ... \(error)")
}
上面的使用方式看起来好奇怪。这个switch的执行结果是“Sunrise is at 6:00 am and sunset is at 8:09 pm”。当switch 后面是常量failure时,输出就是“Failuer … Out of cheese.” 。
case let .Result(sunrise,sunset)相当于case let ServerResponse.Result(sunrise,sunset),把ServerResponse省掉了,此处是构建一个Result case,let 使得参数sunrise和sunset从success这个case实例里获取附加数据。
- 结构
结构跟类一样,有属性有方法有构造方法。主要的区别是在赋值时结构是复制,而类是传引用,其余就是一点语法上无关紧要的小差别。比如:
struct Card {
var rank = Rank.Queen
let suit:Suit
}
var card = Card(rank:Rank.Ace,suit:Suit.Hearts)
上面的结构,没有为它创建构造方法。但它有默认的构造方法,类就不能这样做了。