swift里面的控制流分为For-In 循环
、While 循环
、 条件语句
、控制转移语句
、 提前退出
、检测 API 可用性
For-in循环
相对于OC,swift对for-in做出了加强,不仅仅能对数组遍历,还能对字典遍历,范围可以使用闭区间,item值可以用(_
)进行忽略,还加入了stride(from:to:by:)
、stride(from:through:by:)
等新API
- 遍历数组
let names = ["zhangsan", "lisi", "wangwu"]
for name in names {
print(name)
}
// zhangsan
// lisi
// wangwu
- 遍历字典
通过遍历字典来访问它的键值对。遍历时,字典的每项元素会已(key, value)
元祖的形式返回
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
print("\(animalName)s have \(legCount) legs")
}
// ants have 6 legs
// spiders have 8 legs
// cats have 4 legs
- 区间遍历
for index in 1...5 {
print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
- 忽略变量遍历
当不需要区间序列内的每一项值,可以用下划线(_
)替代变量名来忽略这个值,如下:
let base = 3
let power = 10
var answer = 1
for _ in 1...power {
answer *= base
}
print("\(base) to the power of \(power) is \(answer)")
// 输出 "3 to the power of 10 is 59049"
- 跨越遍历
当止需要取被遍历集合中的部分数据是可以使用跨越遍历(自己取的名字- -),方法名为:stride(from:to:by:)
、stride(from:through:by:)
如下:
let minutes = 60
let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
// 每5分钟渲染一个刻度线(0, 5, 10, 15 ... 45, 50, 55)
}
let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
// 每3小时渲染一个刻度线(3, 6, 9, 12)
}
可以这么理解: to
不包含最后一个值,through
包含最后一个值
While循环
while
循环类似OC的用法,一直运行到条件变成false
。而swift提供两种循环形式:while
和repeat-while
(每次在循环结束后检查条件是否符合,类似OC的do-while
)
-
while
每次循环开始前检查条件是否符合(先判断再循环)如下:
var condition = 0
while condition < 3 {
condition += 1
print(condition)
}
// 1
// 2
// 3
-
repeat-while
每次在循环结束后检查条件是否符合(先循环然后再判断,类似OC的do-while
)如下:
var condition = 3
repeat {
condition += 1
print(condition)
} while condition < 3
// 4
条件语句
swift提供两种条件语句if
和switch
-
if
条件语句
先判断if后面的语句是否为true
,然后执行相关代码。if
语句允许二选一执行,叫做else
从句。也就是当条件为false
时,执行else
语句如下:
temperatureInFahrenheit = 40
if temperatureInFahrenheit <= 32 {
print("It's very cold. Consider wearing a scarf.")
} else {
print("It's not that cold. Wear a t-shirt.")
}
// 输出 "It's not that cold. Wear a t-shirt."
-
switch
条件语句
switch
语句会尝试把某个值与若干个模式进行匹配。根据第一个匹配成功的模式,switch
语句会执行对应的代码。当有可能的情况较多时,通常switch
语句替换if
语句。每一个case都是代码执行的一条分支。switch
语句会决定哪一条分支应该被执行。这个流程被称作根据给定的值切换(switching),switch语句必须完备,每一个可能的值都必须至少有一个case分支与之对应。当某些不能涵盖所有值得情况下,可以使用默认default
分支来涵盖其它所有没有对应的值如下:
let someCharacter: Character = "z"
switch someCharacter {
case "a":
print("The first letter of the alphabet")
case "z":
print("The last letter of the alphabet")
default:
print("Some other character")
}
// 输出 "The last letter of the alphabet"
- 不存在隐式的贯穿
与C和OC中的switch
语句不同,在swift中,当匹配的case分支中的代码执行完毕后,程序会终止switch
语句,而不会继续执行下一个case分支。也就是说,不需要在case分支中使用break
。所以分支下必须要有执行语句,不然会编译错误如下:
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a": // 无效,这个分支下面没有语句
case "A":
print("The letter A")
default:
print("Not the letter A")
}
// 这段代码会报编译错误
为了让单个 case 同时匹配 a
和 A
,可以将这个两个值组合成一个复合匹配,并且用逗号分开如下:
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
print("The letter A")
default:
print("Not the letter A")
}
// 输出 "The letter A
-
switch
区间分配
case分支的模式也可以是一个值的区间,使用区间匹配来输出任意数字对应的自然语言格式如下:
let approximateCount = 62
let countedThings = "moons orbiting Saturn"
let naturalCount: String
switch approximateCount {
case 0:
naturalCount = "no"
case 1..<5:
naturalCount = "a few"
case 5..<12:
naturalCount = "several"
case 12..<100:
naturalCount = "dozens of"
case 100..<1000:
naturalCount = "hundreds of"
default:
naturalCount = "many"
}
print("There are \(naturalCount) \(countedThings).")
// 输出 "There are dozens of moons orbiting Saturn."
-
switch
-元祖
我们还可以使用元祖在同一个switch
语句中测试多个值,元祖中的元素可以是值,也可以是区间。可以使用下划线(_
)来匹配所有可能的值。