Swift枚举

枚举简单认识

  • Swift中的枚举比OC中的枚举强大, 因为Swift中的枚举是一等类型, 它可以像类和结构体一样增加属性和方法。

语法

enum 枚举名{
    case
    case
    case
    ...
}

举例:

//多个case分开写
enum CompassPoint {
    case north
    case south
    case east
    case west
}

//多个case写在同一行,使用逗号分开
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

//创建CompassPoint的枚举实例
var directionToHead = CompassPoint.west
directionToHead = .east

//也可以写成
//var directionToHead:CompassPoint = .west

注意:与C和Objective-C不同,Swift枚举在创建时默认不分配整数值。在CompassPoint例子中,未指明CompassPoint成员的类型north,south,east和west不等于隐式0,1,2和3
如果给north指定原始整数值,后面的值默认+1:

enum CompassPoint {
     case north = 5, south, east, west
}

枚举与Switch结合

  • 通常将单个枚举值与switch语句匹配
//switch覆盖了CompassPoint的所有情况,则可省略default
directionToHead = .south
switch directionToHead {
case .north:
    print("Lots of planets have a north")
case .south:
    print("Watch out for penguins")
case .east:
    print("Where the sun rises")
case .west:
    print("Where the skies are blue")
}

//switch没有覆盖Planet的所有情况,需要添加default
let somePlanet = Planet.earth
switch somePlanet {
case .earth:
    print("Mostly harmless")
default:
    print("Not a safe place for humans")
}

关联值(Associated Values)

定义Swift枚举来存储任何给定类型的关联值,而且每种枚举情况的值类型可以不同

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}
//创建Barcode枚举实例
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

可以将关联值提取为switch语句的一部分。将每个关联值提取为常量(let)或变量(var),以便在switch中处理:

switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

如果枚举case的所有关联值都被提取为常量,或者都被提取为变量,则可以将var或let放置在case名称前面,来提取所有的关联值:

switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

原始值(Raw Values)

  • 隐式分配原始值
    当使用存储整数或字符串原始值的枚举时,不必为每种case显式分配原始值,Swift将自动为其分配值。如果使用整数为原始值,则每个case的原始值依次自增1。若第一个case没有设置原始值,则默认为0:
enum Planet: Int {    //【Int表示原始值类型】
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

当使用字符串作为原始值类型时,每个case的原始值是该case的名称。

enum CompassPoint: String {
    case north, south, east, west
}

发现去掉String原始值类型,每个case的原始值也是该case的名称

  • 使用rawValue将枚举值转换为原始值:
let earthsOrder = Planet.earth.rawValue
// earthsOrder is 3
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"
  • 原始值初始化枚举实例:
let directionToHead = CompassPoint(rawValue: "north")!

注意点:1.原始值区分大小写。2.返回的是一个可选值,因为原始值对应的枚举值不一定存在。

你可能感兴趣的:(Swift枚举)