一、swift中枚举的定义
swift中枚举的定义比oc中枚举更加简洁,用enum来声明枚举类型,使用case关键字明确枚举的成员值。格式如下:
enum Colors{
case Blue
case Red
case Orange
}
枚举值也可以写在一行上,但是要用逗号分隔开,如下所示:
enum Colors{
case Blue, Red, Orange
}
枚举的名称Colors首字母要大写,尽量使用单数名称,少用复数的名称,使枚举的含义看起来更加一目了然。
二、swift枚举和OC枚举的不同点
C和OC中将枚举定义为一组(连续或间断的)整数值,而Swift中的枚举值不仅仅局限于整数,还可以是字符串、字符、浮点数等类型,使用起来更加灵活。
枚举赋初值:
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
你也可以隐式指定的原始值:
当你在操作存储整数或字符串原始值枚举的时候,你不必显式地给每一个成员都分配一个原始值。当你没有分配时,Swift 将会自动为你分配值。
实际上,当整数值被用于作为原始值时,每成员的隐式值都比前一个大一。如果第一个成员没有值,那么它的值是 0 。
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
在上面的例子中, Planet.mercury有一个明确的原始值 1 , Planet.venus的隐式原始值是 2,以此类推。
当字符串被用于原始值,那么每一个成员的隐式原始值则是那个成员的名称。
下面的枚举是先前 CompassPoint枚举的简化,有字符串的原始值来代表每一个方位的名字:
enum CompassPoint: String {
case north, south, east, west
}
在上面的例子中, CompassPoint.south有一个隐式原始值 "south" ,以此类推。
你可以用 rawValue属性来访问一个枚举成员的原始值:
let earthsOrder = Planet.earth.rawValue
// earthsOrder is 3
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"
三、枚举的使用
你可以使用switch语句来匹配枚举值,需要注意的是,判断枚举成员时,switch语句应该是全覆盖的。如果不能为所有枚举成员都提供一个 case,那你也可以提供一个 default情况来包含那些不能被明确写出的成员。如果没有全覆盖,就会产生编译错误。
let somePlanet = Planet.earth
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
枚举值的修改
anotherPlanet = Planet.earth
anotherPlanet = .venus
当用Planet中可用的某一值初始化时 anotherPlanet的类型会被推断出来。一旦 anotherPlanet以 Planet类型被声明,你就可以用一个点语法把它设定成不同的 Planet值
四、遍历枚举
如果要遍历枚举,在枚举定义的时候,在枚举名称后面添加关键字CaseIterable即可。之后通过allCase访问枚举类型所有情况的集合。例如
enum Beverage: CaseIterable {
case coffee, tea, juice
}
let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) beverages available")
// Prints "3 beverages available"
可以像遍历其他集合一样遍历枚举值的集合
for beverage in Beverage.allCases {
print(beverage)
}
后续补充