[连载]Swift开发入门(05)

枚举是定义符号常量的手段,它把一堆相似的值组织在一起。例如你在指定文字对齐方式的时候通常有三种可选的值:左对齐、右对齐和居中对齐;你在处理游戏中的方法时可能的取值有东、西、南、北。Swift中的枚举比你了解的其他语言的枚举更加强大,它的行为类似于类和结构体,它甚至可以有自己的方法,包括构造器。

创建枚举

我们先通过一个简单的例子来认识一下枚举。玩过扑克牌的都知道,扑克有四种花色,分别是黑桃(spade)、红心(heart)、草花(club)和方块(diamond),如果我们要做一个扑克游戏,那么就可以用枚举来描述这四种花色,代码如下所示:

enum Suite {case Spadecase Heartcase Clubcase Diamond}

又比如我们要做一个绘图软件,该软件支持绘制矩形、圆形和三角形,那么可以用下面的枚举来表示不同类型的图形。

enum Shape {case Rectanglecase Trianglecase Circle}在switch多分支结构中使用枚举

我们可以使用switch多分支结构来处理枚举类型的值,如下所示:

var shape:Shape = Shape.Circleswitch(shape) {case .Rectangle:println(“You choose a rectangle”)breakcase .Triangle:println(“You choose a triangle”)breakcase .Circle:println(“You choose a circle”)break}

Swift中的switch语句要求必须覆盖所有的可能,如果你如下书写上面这段代码,就会产生一个编译错误:“switch must be exhaustive, consider adding a default clause.”。

var shape:Shape = Shape.Circleswitch(shape) {case .Rectangle:println(“You choose a rectangle”)breakcase .Triangle:println(“You choose a triangle”)break}

按照错误提示,我们可以添加一个default分支来消除此编译错误,当所有的case都没有匹配成功时,就会执行default分支。

var shape:Shape = Shape.Circleswitch(shape) {case .Rectangle:println(“You choose a rectangle”)breakcase .Triangle:println(“You choose a triangle”)breakdefault:println(“You choose a circle”)break}

当然也可以在一个case中书写多种可能性,这一点也是Swift对switch结构的改进,,不同于Java、C#、JavaScript这样的语言,完整的代码如下所示:

var shape:Shape = Shape.Squareswitch(shape) {case .Rectangle, .Square, .Diamond:println(“You choose a quadrilateral”)breakcase .Triangle:println(“You choose a triangle”)breakcase .Circle, .Oval:println(“You choose a circle or an oval”)break}枚举类型

在Swift中,枚举在某些程度上跟类和结构体非常类似,它和结构体有相同的值语义,因此也是基于栈分配存储空间。有些枚举甚至可以有成员方法,如下所示:

import Foundationenum Shape {case Rectangle(width: Double, height: Double)case Square(side: Double)case Triangle(base: Double, height: Double)case Circle(radius: Double)func area() -> Double {var result:Double = 0;switch(self) {case .Rectangle(let width, let height):result = width * heightcase .Square(let side):result = side * sidecase .Triangle(let base, let height):result = base * heightcase .Circle(let radius):result = M_PI * radius * radius}return result}}var circle = Shape.Circle(radius: 5)circle.area()

我们还可以在枚举中添加一个工厂方法来创建枚举类型的变量,如下所示:

import Foundationenum Shape {case Rectangle(width: Double, height: Double)case Square(side: Double)case Triangle(base: Double, height: Double)case Circle(radius: Double)func area() -> Double {var result:Double = 0;switch(self) {case .Rectangle(let width, let height):result = width * heightcase .Square(let side):result = side * sidecase .Triangle(let base, let height):result = base * heightcase .Circle(let radius):result = M_PI * radius * radius}return result}static func factory(shapeType: String) -> Shape? {var shape:Shape?switch(shapeType) {case “rectangle”:shape = Shape.Rectangle(width: 5, height: 10)case “square”:shape = Shape.Square(side: 5)case “triangle”:shape = Shape.Triangle(base: 5, height: 10)case “circle”:shape = Shape.Circle(radius: 5)default:shape = nil}return shape}}var rect = Shape.factory(“rectangle”)rect!.area()一个人,一条路,人在途中,心随景动,

[连载]Swift开发入门(05)

相关文章:

你感兴趣的文章:

标签云: