swift-控制流程03-switch

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 语句就已经完备了,因此不需要再书写默认分支

    */

    

  }


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值