感谢原作者 链接:http://www.cocoachina.com/newbie/basic/2014/0611/8771.html
枚举定义了一个通用类型的一组相关的值,使你能够在你的代码中以一个安全的方式来使用这些值。
它们採用了非常多传统上仅仅被类所支持的特征,比如计算型属性(computed properties),用于提供关于枚举当前值的附加信息,实例方法(instance methods)。用于提供和枚举所代表的值相关联的功能。枚举也能够定义构造器(initializers)来提供一个初始成员值。能够在原始的实现基础上扩展它们的功能;能够遵守协议(protocols)来提供标准的功能。
- enum SomeEumeration {
- // enumeration definition goes here
- }
- enum CompassPoint {
- case North
- case South
- case East
- case West
- }
相反的,这些不同的枚举成员在CompassPoint的一种显示定义中拥有各自不同的值。
- enum Planet {
- case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Nepturn
- }
- var directionToHead = CompassPoint.West
一旦directionToHead被声明为一个CompassPoint,你能够使用更短的点(.)语法将其设置为还有一个CompassPoint的值:
- directionToHead = .East
使用显示类型的枚举值能够让代码具有更好的可读性。
- directionToHead = .South
- switch directionToHead {
- case .North:
- println("Lots of planets have a north")
- case .South:
- println("Watch out for penguins")
- case .East:
- println("Where the sun rises")
- case .West:
- println("Where the skies are blue")
- }
- // prints "Watch out for penguins”
- let somePlanet = Planet.Earth
- switch somePlanet {
- case .Earth:
- println("Mostly harmless")
- default:
- println("Not a safe place for humans")
- }
- // prints "Mostly harmless”
然而,有时候会非常实用假设可以把其它类型的关联值和成员值一起存储起来。这能让你随着成员值存储额外的自己定义信息。而且当每次你在代码中利用该成员时同意这个信息产生变化。
- enum Barcode {
- case UPCA(Int, Int, Int)
- case QRCode(String)
- }
- var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
提供的“标识符”值在整数字中有一个下划线,使其便于阅读条形码。
- productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
- switch productBarcode {
- case .UPCA(let numberSystem, let identifier, let check):
- println("UPC-A with value of (numberSystem), (identifier), (check).")
- case .QRCode(let productCode):
- println("QR code with value of (productCode).")
- }
- // prints "QR code with value of ABCDEFGHIJKLMNOP.”
- switch productBarcode {
- case let .UPCA(numberSystem, identifier, check):
- println("UPC-A with value of (numberSystem), (identifier), (check).")
- case let .QRCode(productCode):
- println("QR code with value of (productCode).")
- }
- // prints "QR code with value of ABCDEFGHIJKLMNOP."
作为关联值的替代。枚举成员能够被默认值(称为原始值)预先填充,当中这些原始值具有同样的类型。
- enum ASCIIControlCharacter: Character {
- case Tab = " "
- case LineFeed = " "
- case CarriageReturn = " "
- }
当你開始在你的代码中定义枚举的时候原始值是被预先填充的值,像上述三个 ASCII 码。对于一个特定的枚举成员。它的原始值始终是同样的。关联值是当你在创建一个基于枚举成员的新常量或变量时才会被设置,而且每次当你这么做得时候。它的值能够是不同的。
当整型值被用于原始值,假设其它枚举成员没有值时,它们会自己主动递增。
- enum Planet: Int {
- case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
- }
- let earthsOrder = Planet.Earth.toRaw()
- // earthsOrder is 3
这个样例通过原始值7识别Uranus:
- let possiblePlanet = Planet.fromRaw(7)
- // possiblePlanet is of type Planet?
and equals Planet.Uranus
- let positionToFind = 9
- if let somePlanet = Planet.fromRaw(positionToFind) {
- switch somePlanet {
- case .Earth:
- println("Mostly harmless")
- default:
- println("Not a safe place for humans")
- }
- } else {
- println("There isn't a planet at position (positionToFind)")
- }
- // prints "There isn't a planet at position 9