您的位置:首页 > 移动开发 > Swift

swift-控制流程03-switch

2016-02-23 14:53 381 查看
import UIKit

class ViewController:
UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

/**

switch 试图把某个值与若干个模式(pattern)进行匹配。

如果第一个模式匹配成功,switch
语句会执行对应的代码。

switch 语句最简单的形式就是把某个值与若干个相同类型的值作匹配:

switch 语句由若干个 case
构成。

每个 case
都是一条分支,与if语句类似。

switch 语句会决定哪一条分支应该被执行。

switch 语句必须是完整的。这就是说,每一个可能的值都必须至少有一个 case
与之对应。

在不能覆盖所有值的情况下,使用默认(default)分支处理,默认分支只能在 switch
语句的最后面。

*/

let a = 0

switch a {

case 1,2 :

print("case 1,2 a =
\(a)")

case 3,4 :

print("case 3,4 a =
\(a)")

case 5,6 :

print("case 5,6 a =
\(a)")

case 7,8 :

print("case 7,8 a =
\(a)")

case 9,10 :

print("case 9,10 a =
\(a)")

default :

print("default == a =
\(a)")

}

/**

Swift 的 switch
与 C
语言和 Objective-C
是不同的。

当匹配的 case
分支中的代码执行完毕后,switch就终止了,不会继续执行下一个 case
分支。

这也就是说,不需要在 case
分支中显式地使用 break
语句。

这使得 switch
语句更安全、更易用,也避免了因忘记写 break
语句而产生的错误。

当然也可以在 case
分支中的代码执行完毕前 break

break之后的代码就不执行了,

如果一个case没有执行的语句,就写下一个case,会报错

避免从一个 case
分支贯穿到另外一个,使代码更安全、更直观

*/

//MARK:
范围匹配

/*

case 分支的模式也可以是一个值区间

*/

let count = 18

switch count {

case 1...5 :

print("1~5 count==\(count)")

case 6...10 :

print("6~10 count==\(count)")

case 11...15 :

print("11~15 count==\(count)")

case 16...20 :

print("16~20 count==\(count)")

default:

print("default count==\(count)")

}

/**

switch 语句中可以使用
元组 测试多个值。

元组中的元素可以是值,也可以是区间。另外,使用下划线(_)来匹配所有可能的值。

Swift 允许多个 case
匹配同一个值。

实际上,在这个例子中,点(0, 0)可以匹配所有四个 case。

但是,如果存在多个匹配,那么只会执行第一个被匹配到的 case
分支。

考虑点(0, 0)会首先匹配case (0, 0),因此剩下的能够匹配(0, 0)的
case 分支都会被忽视掉

*/

let point = (1,0)

switch point {

case (0,0) :

print("在原点上")

case (_,0) :

print("在x轴上")

case (0,_):

print("在y轴上")

case (-2...2,-2...2) :

print("在矩形区域内")

default:

print("在矩形区域外")

}

//MARK:
值绑定

/**

值绑定(value binding):case
分支允许将要匹配的值绑定给临时常量或变量,这些常量或变量在该 case
分支可以被引用

*/

let point1 = (2,3)

switch point1 {

case (let x ,
0) :

print("在y轴上
x==\(x)")

case ( 0 ,let y) :

print("在x轴上
y==\(y)")

case (let x,let y) :

print("没有在轴上 x==\(x),y==\(y)")

}

/**

这三个 case
都声明了常量 x 和 y
的占位符,用于临时获取元组 point1
的一个或两个值。

第一个 case ——case (let x, 0)将匹配一个纵坐标为0的点,并把这个点的横坐标赋给临时的常量x。

第二个 case ——case (0, let y)将匹配一个横坐标为0的点,并把这个点的纵坐标赋给临时的常量y。

一旦声明了这些临时的常量,它们就可以在其对应的 case
分支里引用。

在这个例子中,用print进行打印。

这个switch语句不包含默认分支。

这是因为最后一个 case ——case let(x, y)
可以匹配余下所有值的元组。

这使得 switch
语句已经完整了,因此不需要默认分支

在上面的例子中,x
和 y 是常量,这是因为没有必要在其对应的 case
分支中修改它们的值。

它们也可以是变量 ——
程序会创建临时变量,并用相应的值初始化它。

修改这些变量只会影响其对应的 case
分支。

*/

/**

case 分支模式可以使用 where
语句判断额外的条件

*/

let point2 = (-4,4)

switch point2 {

case let(x,y)
where x==y :

print("x==y
在正对角线上")

case let(x,y)
where x == -y :

print("x==-y
在负对角线上")

case let(x,y) :

print("不在对角线上")

}

/*

在上面的例子中,switch
语句会判断某个点是否在正对角线 x == y
上,

是否在负对角线 x == -y
上,或者不在对角线上。

这三个 case
都声明了常量 x 和 y
占位符,用于临时获取元组 point2
的两个值。

这些常量被用作 where
语句的一部分,从而创建一个动态的过滤器 (filter)。

当且仅当 where
语句的条件为 true 时,匹配到的 case
分支才会被执行。

就像是值绑定中的例子,由于最后一个 case
分支匹配了余下所有可能的值,

switch 语句就已经完备了,因此不需要再书写默认分支

*/

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: