Swift-流程控制
2019-09-27 本文已影响0人
X_L_F
条件
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直接跳出了外层循环