美文网首页
swift4.1 系统学习七 条件分支语句

swift4.1 系统学习七 条件分支语句

作者: 小曼blog | 来源:发表于2018-09-28 15:36 被阅读12次

    import Foundation

    //swift学习笔记07

    /*
    控制流语句
    学过任何一种语言的小伙伴们都对控制流语句不陌生,几乎每一天都在用。
    控制流分类:
    1.分支
    2.循环
    */

    /*

    1. do语句块
      这个语句块在我之前的学习中一直在使用,是一种在学习中很方便的写代码的方式。
      作用:
      1》作为一个单独的作用域,声明的局部对象外部是无法访问的。

    允许嵌套,如果内部的变量名字与外部相同,则会访问内部变量。
    */

    do {
        let a = 1, b = 2
        do {
            let a = 10
            let b = 20
            let c = 5
            
            do {
                let a = 30
                let b = 40 + c
                
                print("最里层: a = \(a), b = \(b), c = \(c)")
                //a = 30, b = 45, c = 5
            }
            print("第二层: a = \(a), b = \(b), c = \(c)")
        }
        print("最外层: a = \(a), b = \(b)")
    }
    

    swift中如果不用do引出,而是单单用花括号{ },那么它默认表达的是一个闭包表达式,而不是一个语句块。

    /*
    2.if语句
    注意:
    1》swift中if语句中的条件表达式的圆括号可以省略
    2》swift中if语句中的花括号不能省略,即使只有一条语句
    */

    do {
        let a = 0, b = 10
        if a == 0 {
            print("a = 0")
        } else {
            print("a != 0")
        }
        
        if a + b > 10 {
            print("大于10")
        } else if a + b == 10 {
            print("等于10")
        } else {
            print("小于10")
        }
        
        /*
         初学者要注意
         if 表达式 {
         
         } else if 表达式 {
         
         }
         与
         if 表达式 {
         
         }
         if 表达式 {
         
         }
         这两者之间的不同
         */
    }
    

    /*

    1. 三目条件操作符
      表达式 ? 语句1 :语句2
      意思是: 如果表达式==true,执行语句1,否则执行语句2
      是对if...else 语句的一种更加简单的表达
      */
    do {
        var a = 1, b = 2
        a = a > 0 ? a + b : a - b
        print("a = \(a)")
        
        b = a > b ? a : b
        print("b = \(b)")
      
    }
    

    注意: 三目运算符中的 ?一定要与表达式之间有空格,不然会被当做可选类型的?。最好三目运算符表达式之间都要加空格。

    /*

    1. switch语句
      条件选择多于等于三条的时候,就要考虑使用switch语句,使得逻辑更加的清晰。
      switch 表达式 {
      case 条件1:
      case 条件2:
      ...
      注意:
      1》swift中,switch后面的表达式可以是void类型。
      2》一般情况下switch语句块中,最后会跟一个default标签,以处理异常情况。但是,
      当switch的case语句已经列举了所有类型之后,default就不需要了,如果加了不必要的default,
      编辑器会报出警告。
      3》swift语言中,switch后面的表达式可以是任何遵循了Equatable协议的类型的表达式,
      甚至还可以是一个元类型。
      但是case后面的表达式必须是表示值类型的表达式。
      4》所有的case语句包括default语句都必须至少包含一条语句。
      5》默认情况下,执行完一个case语句块之后直接跳出switch,而不需要显式添加break语句。
      当我们在某些情况下想跳出当前的case语句的时候,可以使用break语句,跳出整个switch语句块。

    switch 常常与 enum 一起使用
    }

    */
    do {
       enum Type: String {
           case iphone5 = "iphone5"
           case iphone6 = "iphone6"
           case iphone7 = "iphone7"
           case iphone8 = "iphone8"
           case iphoneX = "iphoneX"
       }
       
       var type: Type = .iphoneX
       type = .iphone6
       
       switch type {
       case .iphone5:
           print(type)
       case .iphone6:
           print(type)
       case .iphone7:
           print(type)
       case .iphone8:
           print(type)
       case .iphoneX:
           print(type)
       }
       
    }
    
    do {
       
       class Test: CustomStringConvertible {
           var a = 0, b = 100
           init(a: Int, b: Int) {
               self.a = a
               self.b = b
           }
           
           var description: String {
               return "a = \(a), b = \(b)"
           }
           
       }
       
       let t = Test.init(a: 5, b: 10)
       let q = Test.init(a: 6, b: 88)
       
       switch t {
       case let obj:
           print("obj = \(obj)")
           print("value = \(obj.a + t.b)")
       }
       
       switch type(of: t) {
       case let type:
           print("type is :\(type)")
       }
       
       switch type(of: q) {
       case let type:
           print("type is :\(type)")
       }
    }
    
    do {
       struct MyObject: Equatable {
           var a = 0
           var b = 1
           
           public static func == (lhs: MyObject, rhs: MyObject) -> Bool {
               return (lhs.a == rhs.a && lhs.b == rhs.b)
           }
       }
       
       let obj = MyObject(a: 3, b: 4)
       let obj2 = MyObject(a: 3, b: 3)
       
       switch obj {
       case MyObject():
           print("dummy object")
       case obj2:
           print("obj2")
       case MyObject(a:3, b:4):
           print("correct object")
       default:
           print("no match")
       }
       
       //打印出:correct object
    }
    

    /*

    1. case匹配模式
      swift编程语言中的case匹配非常的丰富,除了上面已经介绍过的匹配方式,还有
      1》复合case匹配,
      2》区间匹配,
      3》值绑定匹配形式
      4》以及where从句引出的谓词逻辑匹配。

    */

    //1>复合case匹配
    /*
    概念:一条case语句可以包含多个表达式,各个表达式之间用逗号分隔,这些表达式之间只要有一个能与
    switch表达式匹配上,那就执行该case下的语句。
    */

    do {
        var a: Int8 = 10
        switch a {
            //复合case
        case 0, 1, 2:
            print("zero")
           //case后面的表达式亦需要一定是常量和字面量,也可以是变量
        case a + 1, a:
            print("加1")
            a = a + 1
            print("a = \(a)")
        default:
            break
        }
    }
    
    // case后面还可以跟一个范围表达式
    do{
        let score = 88
        switch score {
        case 0..<60:
            print("不及格")
        case 60..<80:
            print("良好")
        case 80..<99:
            print("优")
        case 100:
            print("完美")
        default:
            break
        }
    }
    
    // swift语言中case匹配还有一个强大的功能——值绑定
    /*
     一般情况下,我们可以直接在case后面直接跟let或者var声明一个局部对象,以捕获switch后面表达式的值。
     该对象只能在当前的case中可见。不需要default标签。
     */
    
    do {
        let a = 8
        switch a {
        case 0, 1, 2..<5:
            print("正产值")
        case let v:
            print("v = \(v)")
        }
        
        switch a {
        case var v:
            v += 1
            print("v = \(v)")
        case 100:
            print("永远不会执行")
        }
        
        print("a = \(a)")
    }
    
    //基于值绑定基础上使用where从句
    /*
     where后面直接跟一个bool表达式,表示当该表达式为真的时候则匹配当前的case,
     这么一来,只绑定也无法覆盖所有的case情况了,所以需要default处理。
     */
    
    do {
        let a = 8
        switch a {
        case let v where v > 0 && v < 3:
            print("正常值")
        case let v where v >= 3 && v <= 10:
            print("\(v)在[3,10]之间")
        default:
            print("别的值")
        }
    }
    
    // 6. case 匹配模式用于元组对象
    
    do{
        let tuple = (8, 9)
        switch tuple {
        case (0, 0):
            print("0")
        case (1, 2), (3, 4):
            print("one")
        case (5, 6), (7, 8):
            print("two")
        case (_, 8):
            print("哈哈哈哈")
        case (1...3, 5..<10), (_, 4...9):
            print("区间")
        default:
            print("其他值")
        }
    }
    

    相关文章

      网友评论

          本文标题:swift4.1 系统学习七 条件分支语句

          本文链接:https://www.haomeiwen.com/subject/npjpoftx.html