一、枚举语法
enum SomeEnumration {
   // 枚举的定义
}

例如方向的枚举定义:

enum Direction {
        case North
        case South
        case East
        case West
    }

其中的 case

注意:不像C和OC,Swift的枚举成员在创建时不会被赋予一个默认的整数值! 上面的例子中 North,South,East,West不是隐式的等于 0 ,1, 2, 3   !

多个成员值可以出现在同一行,用逗号隔开如:

enum Planet {
        case Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Nepturns
    }



二、匹配枚举值和switch语句

1.匹配单个枚举值和switch语句:

var direction = Direction.South
        switch direction {
        case .North:
            print("North")
        case .East:
            print("East")
        case .West:
            print("West")
        case .South:
            print("South")
        }

上面 direction被推断为 Direction类型,所以可以直接使用 . 来访问 Direction的值。

2.当不需要匹配每个枚举成员的时候可以使用默认 default分支来涵盖所有未被提出的成员:

var somePlanet = Planet.Earth
        switch somePlanet {
        case .Earth:
            print("我们生活的星球")
        default:
            print("不适合生存")
        }



三、实例值

Swift的枚举可以存储任何类型的实例值,如果需要每个成员的数据类型可以是各不相同的。

例如一个库存跟踪系统需要两种条形码来跟踪商品。第一种是 UPC-A格式的一维码,使用数字 0-9。每一个条形码都有一个代码“数字系统”的数字,该数字后接10个代表“标识符”的数字,最后一个数组是检查位,用来验证代码是否被正确扫描。

格式如: 7 2324567894 5

对于库存系统来说,能够把UPC-A码作为三个整型值的元组,把QR码作为一个任何长度的字符串存储起来是十分方便的。

      在Swift中用枚举定义两种条码:

enum Code {
        case UPCA(Int,Int,Int)
        case QRCode(String)
    }

以上代码定义了一个名为Code的枚举,他可以是一个UPAC的实例值(Int,Int,Int),或者是一个QRCode的一个字符串(String)实例值。

Int或者String的实际值,他只是定义了实例值的类型。

使用如下:

var code = Code.UPCA(8, 1237545678, 9)
var codeStr = Code.QRCode("abcdefg")

如 二 中所提到的不同的条形码可以用 switch 语句来检查。可以在switch的case分支代码中提取每个实例值作为一个常量(用let修饰)或者变量(用var修饰)来使用:

switch code {
        case .UPCA(let numberSystem, let identifier, let check):
            print("UPC-A with value of \(numberSystem),\(identifier),\(check)")
        case .QRCode(let productCode):
            print("QR code with value of \(productCode)")
        }

为了简介也可以使用如下写法:

switch code {
        case let(var)  .UPCA(numberSystem, identifier, check):
            print("UPC-A with value of \(numberSystem),\(identifier),\(check)")
        case let (var) .QRCode(productCode):
            print("QR code with value of \(productCode)")
        }



四、原始值



枚举成员可以有默认值()原始值,这些原始值的类型需要保持一致。
enum ASCIIControllCharacter : Character {

   case Tab = "\t"
   case LineFeed = "\n"
   case Return = "\r"
}

注意:原始值和实例值是不同的。当你开始定义枚举时,原始值是被预先填充的值,像上面的枚举。对于一个特定的枚举成员,他的原始值始终是相同的。实例值是当你在创建一个基于枚举的成员的新常量或者变量是才会诶设置。并且每次他的值是可以不同的。

    原始值可以是字符串,字符,或者任何整型值或者浮点型。每个原始值在他的枚举声明中必须是唯一的。当整型被用于原始值,如果其他成员没有值时他们会自动递增(这一点跟OC的枚举很像)。

enum Planet : Int {
        case Mercury = 1,Venus ,Earth,Mars,Jupiter,Saturn,Uranus,Nepturns
    }

上面的枚举 Mercury = 1 ,自动递增意味着 Venus = 2 以此类推。

使用枚举成员的 toRow方法可以访问该枚举成员的原始值。

let earthOrder = Planet.Earth.toRow()
// earthOrder = 3

与之相对的使用 fromRow

let planet = Planet.fromRow(7)
// planet = Uranus

在这里并非所有的 Int 值都可以找到与之相匹配的 planet 。 所以 fromRow

let positonToFind = 9
if let somePlanet = Planet.fromRow(positionToFind) {
   // ....
} else {
  // ....
}

这里使用了可选绑定,通过原始值9试图找到与之对应的原始值 。  if let somePlanet = Planet.fromRow(positionToFind) 获得一个可选的 Planet 。这里没有找到与 9 对应的枚举成员所以会执行 else 部分。

注:

Swift枚举中支持以下四种关联值类型:

  • 整型(Integer)
  • 浮点数(Float Point)
  • 字符串(String)
  • 布尔类型(Boolean)

参考:Swift官方教程