目录
1.枚举的定义
枚举在C/C++/c#中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。
例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY,就是一个枚举。
在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多在传统上只被类(class)所支持的特性,例如计算型属性(computed properties),用于提供枚举值的附加信息,实例方法(instance methods),用于提供和枚举值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始值;可以在原始实现的基础上扩展它们的功能;还可以遵守协议(protocols)来提供标准的功能。
2.枚举的使用
使用enum关键词来创建枚举,并且把它们的整个定义放在一对大括号内
enum Direction {
case North
case South
case East
case West
}
//枚举也可以写成一行
enum Direction2 {
case North,South,East,West
}
枚举中定义的值(如 North,South,East和West)是这个枚举的成员值(或成员)。使用case关键字来定义一个新的枚举成员值。
与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。North,South,East和West不会被隐式地赋值为0,1,2和3。相反,这些枚举成员本身就是完备的值,这些值的类型是已经明确定义好的Direction类型。多个成员值可以出现在同一行上,用逗号隔开。
//声明一个枚举
var a = Direction.North
var a2 = Direction.West
a2 = .South//.South = Direction.South,a2肯定是Direction类型的
//枚举也可以这样写,明确规定a3就是Direction类型
var a3:Direction = .East
可以使用switch语句匹配单个枚举值:
var d4 = Direction.North
switch d4 {
case .North:
print("north")
case .South:
print("South")
case .East:
print("East")
default:
print("default")
}
3.枚举的原始值
OC
中枚举的本质就是整数,所以OC
中的枚举是有原始值的,默认是从0开始,而Swift
中的枚举默认是没有原始值的,但是可以在定义时告诉系统让枚举有原始值
//定义枚举类型为Int类型,默认从0开始,后面逐一加一(这就和C语言类似了)
enum Courses:Int {
case math = 1,English,Chinese
}
除了Int类型,Swift枚举更加强大,还可以定义为Double、String等
但是如果指定除Int的其他类型,需要给所有枚举值赋值
enum MathMethod: String {
case Add = "add"
case Sub = "sub"
case Mul = "mul"
case Div = "div"
}
enum Constants: Double {
case π = 3.14159
case e = 2.71828
case φ = 1.61803398874
case λ = 1.30357
}
4.枚举值和原始值之间的转化:
5.枚举的关联值
枚举的关联值是将额外信息,附加到枚举值中的一种方式。使用关联值,每一个枚举值就可以是在某种特定的情形下,关联特定的值。
比如在某超市,可能存在进货—“买”和售卖—“卖”两种不同的交易类型。除此之外每手交易还要制定明确的售卖商品名称和售卖的交易数量。
//定义一个交易枚举
enum Supermarket {
case Purchase(String, Int) //买,关联一个字符串和一个整形
case Sell(String, Int) //卖,关联一个字符串和一个整形
case SellGoods(String, Int, String) //每个枚举值的关联类型可以不一样
}
重新定义一个交易枚举,为关联值加上标签说明
enum Trade {
case Purchase(product: String, amount: Int) //买,商品名称和交易数量
case Sell(product: String, amount: Int) //卖,关联商品名称和交易数量
}
创建一个枚举,关联某些值
var tradeBuy = Trade.Purchase(product: "可乐", amount: 1100)
var tradeBuy2 = Trade.Purchase(product: "面包", amount: 230)
var tradeSell = Trade.Sell(product: "牛奶", amount: 1500)
提取值的方式
//第一种方式提取关联值,利用switch语句提取关联值
switch(tradeBuy){
case .Purchase(let product, let amount):
print("Buy \(product) with \(amount) number")
case let .Sell(product, amount)://简化
print("Sell \(product) with \(amount) number")
}
//第二种方式提取关联值,使用模式匹配提取关联值
if case let Trade.Sell(product, amount) = tradeSell {
print("Sell \(amount) of \(product)")
}
6.枚举的属性
尽管增加一个存储属性到枚举中不被允许,但你依然能够创建计算属性和类型属性。当然,计算属性的内容都是建立在枚举值下或者枚举关联值得到的。
enum Person {
case birthday;
case height;
var age:Int {
return 18;
};
static let weight = 65
}
不能包含存储属性 会报错:Enums must not contain stored properties
7.枚举中包含方法
Swift中的枚举也可以包含方法,可以是实例方法也可以是静态方法
enum Person {
case birthday;
case height;
var age:Int {
return 18;
};
static let weight = 65
func myName() -> Void {
print("myName:zhangsan")
}
static func test() {
print("test")
}
}
let p = Person.height
let age = p.age
print("age:\(age)")
p.myName()
Person.test()