Swift基础语法: 24 - Swift的枚举语法, 匹配枚举值和 Switch 语句, 关联值, 原始值

在前面,我们把函数和闭包解决完毕了,现在让我们来看看Swift中的枚举和Switch:


1.枚举语法

所谓的枚举其实就是定义一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。

在Swift中的枚举和OC或者C不太一样,在Swift中的枚举,我们可以不必为枚举每一个枚举成员添加一个值,如果一个值(被认为是“原始”值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或是一个整型值或浮点值,并且在Swift 中,枚举类型是一等(first-class)类型,废话少说,让我们来看看例子:

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

PS: 不像 C 和 Objective-C 一样,Swift 的枚举成员在被创建时不会被赋予一个默认的整数值,在上面的 CompassPoints 例子中,North,South,East和West不是隐式得等于0,1,2 和 3,相反的,这些不同的枚举成员在 CompassPoint 的一种显示定义中拥有各自不同的值.

除了这种定义枚举的方式,我们还有另外一种方式,比如:

enum CompassPoint {
    case North,East,West
}

// 使用枚举成员
var directionToHead = CompassPoint.West
// 或者
directionToHead = .East

PS: 这种写法更加的简单一些,但必须得以 “(,)”隔开,而且每一个枚举成员的首写字母都必须得大写.


2.匹配枚举值和Switch语句

匹配Switch语句的时候,我们可以这么写,比如:

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")
}
// 打印出来的结果: Watch out for penguins

在某些情况下,我们还可以这么使用枚举和Switch,比如:

enum Planet {
    case Earth,Mars,Pluto
}

let somePlanet = Planet.Earth
switch somePlanet {
    case .Earth:
        println("Mostly harmless")
    default:
        println("Not a safe place for humans")
}
// 打印出来的结果: Mostly harmless

PS: 在我们的太阳系中,就只有地球才有生物生存,其他星球对人类来说都是很危险的,所以我们这里匹配的对象就只有地球,除去地球之外都是危险的,既然如此,那么在在Switch中我们就匹配一个就足以了,其他的星球我们都用default来表示.


3.关联值

在我们现实生活中存在着很多中条形码,这里我拿两种作为解释,一种是商品条形码,一种是我们经常都会看到的二维码,让我们一起来看看在枚举中是怎么使用的:

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

PS: 在这里我们可以理解为,UPCA这个枚举成员关联的值是三个Int类型,QRCode的关联值是String类型.

现在我们来正式使用:

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).")
}
// 打印出来的结果: QR code with value of ABCDEFGHIJKLMNOP.

在Switch的第一个case中,如果我们需要三个值都为常量或者变量的时候,我们除了上面这种写法,还有第二种更加简洁的写法,比如:

switch productBarcode {

    case let .UPCA(numberSystem,identifier,check):
        println("UPC-A with value of \(numberSystem),\(check).")

    case .QRCode(let productCode):
        println("QR code with value of \(productCode).")
}
// 打印出来的结果: QR code with value of ABCDEFGHIJKLMNOP.

4.原始值

在枚举中,我们也可以像OC那样给每一个枚举成员初始化一个值,这个值在Swift中称为原始值,比如:

enum ASCIIControlCharacter: Character {
    case Tab = "\t"
    case LineFeed = "\n"
    case CarriageReturn = "\r"
}

PS: 在上面的例子中,如果要在枚举中初始化枚举成员的值时,必须给该枚举类型设置类型,并且每一个枚举成员所存储的类型必须一致,否则就会报错.

在枚举中的原始值和关联值并不一样,原始值可以存储字符串,字符,整型,浮点型等等,比如:

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

这个例子中的枚举类型是Int类型,并且第一个枚举成员的初始值为1,如果后面的值没有自定义数值,那么它们就会自动递增,我们可以调用一下看看:

enum Planet: Int {
    case Mercury = 1,Neptune
}
let a = Planet.Mars.rawValue
println(a)
// 打印出来的结果是: 4

PS: 在Int类型下的枚举,它默认的第一个枚举类型成员数值是从0开始的.

我们也可以通过一个常量的数值来查找枚举里面成员,并且可以使用Switch来进行匹配,Neptune } let positionToFind = 9 if let somePlanet = Planet(rawValue: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)") } // 打印出来的结果: There isn't a planet at position 9


好了,这次我们就讲到这里,下次我们继续~

相关文章

Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语言,就成为了...
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让iOS开发更简单...
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swift语言的源码,...
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jian-zi-ding-yi...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...