美文网首页
Swift-流程控制

Swift-流程控制

作者: X_L_F | 来源:发表于2019-09-27 20:23 被阅读0次

    条件

    1.ifelse

    • 条件语句的"()"可以省略,但"{}"则不能省略
    • 条件语句的判断条件只能是Bool类型
    /**
    *   正确示范:条件语句可以省略(),但不能省略{}
    */
    let score = 80;
    if score <= 100 && score >= 90 {
        print("优")
    }else if score < 90 && score >=80 {
        print("良")
    }else if score < 80 && score >=70 {
        print("中");
    }else if score < 70 && score >=60 {
        print("及格");
    }else {q
        print("不及格");
    }
    
    /**
    *   错误示范:条件语句不为Bool类型
    */
    let pass = 1;
    if pass {           // 此处会提示不能为Int类型
        print("通过了");
    }else {
        print("没通过");
    }
    
    

    2.switch

    2.1注意点:

    • switch中默认使用break
    • switch中case后禁止带"{}"
    • switch需要枚举完所有情况
    • switch每个情况至少带有一句语句(备注:不能用";"表示,可以用break)
    
    /**
    *   枚举完所有情况1
    */
    enum Person {
        case Rose
        case Jack
    }
    
    let person = Person.Rose
    switch person {
        case .Rose:     // 自带break
            print("\(person)")
        case .Jack:
            print("\(person)")
    }
    // 结果: Rose
    
    
    /**
    *   枚举完所有情况2
    */
    let number = 1
    switch number {
        case 1:
            print("first")
        case 2:
            print("second")
        default:        // 需要用default来枚举完所有Int的情况
            break       // 至少一个语句
    }
    // 结果: first
    
    
    
    

    2.2技巧

    2.2.1 switch支持字符串、字符、元组、区间条件等写法
    /**
    * 支持字符串
    */
    let person = "Jack"
    switch person {
        case "Rose":
            print("\(person)")
        case "Jack":
            print("\(Jack)")
        default:
            print("Wrong Person")
    }
    // 结果:Jack
    
    /**
    * 支持区间写法
    */
    let score = 90
    switch score {
        case 90...100:
            print("优")
        case 80...89:
            print("良")
        case 70...79:
            print("中")
        case 60...69:
            print("及格")
        default:
            print("不及格")
    }
    // 结果:优
    
    /**
    *   支持元组写法
    */
    let point = (1, 1)
    switch point {
        case (_, 1):    // 表示忽略第一个值,匹配第二个值即可
            print("in 1 line")
        case (let x, 1):    // 与上面的效果类似。但此处多了保存第一个值的常量
            print("\(x)")
        case (-1...1, -1...1):  // 此处可表示一个区间
            print("in right area")
        case let (x, y):    // 类似于default的效果,但多了保存值的常量
            <!--print("\(x),\(y)")-->
    }
    
    
    2.2.2 贯穿写法

    switch默认自带break,因此若要支持匹配多种情况,则需要明确使用贯穿写法

    /**
    *   贯穿写法1。使用 fallthrough
    */
    let person = "Jack"
    switch person {
        case "Jack":
            fallthrough
        case "Rose":
            print("Right Person")
        default:    
            print("Wrong Person")
    }
    // 结果:Right Person。
    
    /**
    *   贯穿写法2。使用","进行分割
    */
    let person = "Rose":
    switch person {
        case "Jack", "Rose":
            print("Right Person")
        default:
            print("Wrong Person")
    }
    // 结果:Right Person
    
    
    2.2.3 where条件的使用

    使用where语句可以达到过滤的效果

    /**
    *   例子1
    */
    let point = (1, 1)
    switch point {
        case (let x, 1) where x == 1:   // 表示第二个值必须要1,再判断第一个值是否等于1
            print("Right Point")
        default:
            print("Wrong Point")
    }
    
    /**
    *   例子2
    *   该例子效果有点类似区间判断写法
    */
    let score = 80
    switch score {
        let s where s>=90 && s<=100:
            print("优")
        let s where s>=80 && s<90:
            print("良")
        let s where s>=70 && s<80:
            print("中")
        let s where s>=60 && s<70:
            print("及格")
        default:
            print("不及格")
    }
    

    循环

    1.while

    var i = 0
    while i < 3 {
        print(i)
        i += 1
    }
    

    备注

    出于安全起见,在swift中是没有 ++/-- 概念的。

    2.repeat

    /**
    *   repeat...while类似于do...while,
    *   至少执行一次
    */
    var i = 0
    repeat {
        print(i)
        i += 1
    }while i < 3
    

    3.for

    3.1 for 主要应用到区间

    • 使用区间
    /**
    *   例子1:闭区间
    */
    for i in 0...3 {
        print(i)
    }
    // 结果:0,1,2,3
    
    /**
    *   例子2:半闭区间
    */
    for i in 0..<3 {
        print(i);
    }
    // 结果:0,1,2
    
    • for中的条件语句部分不能是字符(串)区间
    /**
    * 错误示范:使用字符(串)区间
    */
    for str in "a"..."b" {
        print(str)
    }
    // 编译不通过
    

    3.2 遍历数据类型

    let names = ["a", "b", "c"]
    /**
    * 例子1:数组加上闭区间
    */
    for name in names[0...2] {
        print(name)
    }
    // 结果:a b c
    
    /**
    * 例子2:数组加上半开区间
    *   半开区间的情况下,编译器会自动推算数组的长度
    */
    for name in names[0...] {
        print(name)
    }
    // 结果:a b c
    

    3.3 for的初始量实际上let类型,所以如果需要改变,则需要显示未var类型

    /**
    * 例子1:
    */
    for i in 0...10 {
        print(i)
        i += 2;     // 不允许,因为i实际上为let
    }
    
    /**
    *   例子2:使用var
    */
    for var i in 0...10 {
        print(i)
        i += 2;
    }
    // 结果:0 2 4 8 10
    
    

    3.4 for 使用where语句

    /**
    *   此处where起到一个过滤作用,并不是退出的条件
    */
    for i in 0...10 where i % == 0 {
        print(i)
    }
    // 结果:0 2 4 6 8 10
    

    3.5 间隔遍历

    使用stride函数

    /**
    * 使用stride函数,实际就是返回条件的序列(条件:从0开始,到10结束,间隔为2)
    */
    for i in stride(from: 0, to: 10, by: 2) {
        print(i)
    }
    // 结果:0 2 4 6 8 10
    

    3.6标签语句

    利用标签语句可以直接跳出外部循环(效果有点像汇编中jump函数,不过只能用于循环的退出)

    var sequeue  = [9, 8, 7, 6, 5, 4, 3, 2, 1]
    outer:
        for i in 0..<sequeue.count {
            for j in i+1..<sequeue.count {
                if sequeue[i] > sequeue[j] {
                    if sequeue[i] == 5 {
                        break outer
                    }
                    let tem = sequeue[i]
                    sequeue[i] = sequeue[j]
                    sequeue[j] = tem
                }
            }
    }
    // 上述break直接跳出了外层循环
    

    相关文章

      网友评论

          本文标题:Swift-流程控制

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