Swift-流程控制

2019-09-27  本文已影响0人  X_L_F

条件

1.ifelse

/**
*   正确示范:条件语句可以省略(),但不能省略{}
*/
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注意点:


/**
*   枚举完所有情况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 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直接跳出了外层循环
上一篇下一篇

猜你喜欢

热点阅读