swift中的枚举

187 阅读3分钟

一、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)
}



后续补充

五、枚举的关联值

六、递归枚举