For-In 循环
- 常见for-in 循环
let arr = ["A","B","C"]
for value in arr {
print(value)
}
let dic = ["key":"a","key1":"b"]
for (key,value) in dic {
print("(key)---(value)")
}
for index in 1 ..< 3 {
print(index)
}
- 如果不需要序列中的每个值,则可以使用下划线代替变量名来忽略这些值
var a = 2
let b = 3
for _ in 1 ... b {
a = b
}
print(a)
- 可跳过不需要的打印的值
//stride(from:to:by:)封闭范围是个开区间
for value in stride(from: 0, to: 10, by: 2) {
print(value) //0 2 4 6 8
}
//stride(from:through:by:)封闭范围是个闭区间
for value in stride(from: 0, through: 10, by: 2) {
print(value) //0 2 4 6 8 10
}
While 循环
- While循环
var a = 3
while a > 0 {
a -= 1
print(a) //2 1 0
}
- repeat- while循环,类似(do-while)
var a = 0
repeat {
a = 1
print(a) //1 2 3
} while a < 3
条件语句
- if、if...else 等
let value = 5
if value > 3 {
print("(value) is big than 3")
}
if value > 6 {
print("(value) is big than 6")
}else{
print("(value) is smaller than 6")
}
switch
- 不需要在 case 分支中显式地使用break语句,当匹配的 case 分支中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个 case 分支
let value = 2
switch value {
case 1:
print(value)
case 2:
print(value)
case 3:
print(value)
default:
print(value)
}
- 单个case同时匹配2和3,可以将这个两个值组合成一个复合匹配
let value = 2
switch value {
case 1:
print(value)
case 2 , 3:
print(value)
default:
print(value)
}
- case 分支的模式也可以是一个值的区间
switch value {
case 1:
print(value)
case 2 ..< 9:
print(value)
case 10:
print(value)
default:
print(value)
}
- 使用元组在同一个switch语句中测试多个值。元组中的元素可以是值,也可以是区间。另外,使用下划线(_)来匹配所有值
let somePoint = (1, 1)
switch somePoint {
case (0, 0):
print("(somePoint) 原点")
case (_, 0):
print("(somePoint) 在x轴上")
case (0, _):
print("(somePoint) 在y轴上")
case (-2...2, -2...2):
print("(somePoint) 在区域里")
default:
print("(somePoint) 在区域外")
}
- case 分支允许将匹配的值声明为临时常量或变量,并且在case分支体内使用
let anotherPoint = (0, 2)
switch anotherPoint {
case (let x, 0):
print("x 轴的值是 (x)")
case (0, let y):
print("y 轴的值是 (y)")
case let (x, y):
print("点的坐标是 ((x), (y))")
}
- 可以使用where语句来判断额外的条件
let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
print("((x), (y)) 在 x == y线上")
case let (x, y) where x == -y:
print("((x), (y)) 在 x == -y 线上")
case let (x, y):
print("((x), (y)) 只是任意一点")
}
- 复合匹配 当多个条件可以使用同一种方法来处理时,可以将这几种可能放在同一个case后面,并且用逗号隔开
let stillAnotherPoint = (9, 1)
switch stillAnotherPoint {
case (let distance, 0), (0, let distance):
print("(distance) 在轴上")
default:
print("不是在轴上")
}
控制转移语句
- continue:立刻停止本次循环,重新开始下次循环
- break:立刻结束整个循环的执行
- fallthrough:不会检查它下一个将会落入执行的 case 中的匹配条件。fallthrough简单地使代码继续连接到下一个 case 中的代码
let flag = 5
var description = "北京"
switch flag {
case 5:
description = "的"
fallthrough
case 10:
description = "冬天"
default:
description = "全是霾"
}
print(description) //北京的冬天
- return:跳出函数
- throw:
提前退出(guard...else)
- 能使用
if...else
的地方都能使用guard...else
,但是反过来未必。guard一定要和else一起使用,而且使用的地方也必须是在函数中
guard *判断语句* else {
*****
breakreturncontinue...
}
语句组
- 当判断语句的条件满足的时候,就会去执行语句组,但是在不满足的情况下,就会去执行else中的语句,并且必须写上break、return、continue、throw等关键字作为结束符
let score = 59
guard score >= 60 else {
print("考试不及格") // 不满足就返回
return
}
print(score)
整个流程都是比较清晰的,而且代码量也比if嵌套的少
检测 API 可用性
- Swift内置支持检查 API 可用性,这可以确保我们不会在当前部署机器上,不小心地使用了不可用的API
if #available(platform name version, ..., *) {
APIs 可用,语句将执行
} else {
APIs 不可用,语句将不执行
}
- 在它一般的形式中,可用性条件使用了一个平台名字和版本的列表。平台名字可以是
iOS
,macOS
,watchOS
和tvOS
。除了指定像 iOS 8 或 macOS 10.10 的大版本号,也可以指定像 iOS 8.3 以及 macOS 10.10.3 的小版本号
if #available(iOS 12, macOS 10.12, *) {
print("在 iOS 使用 iOS 12 的 API, 在 macOS 使用 macOS 10.12 的 API")
} else {
print("使用先前版本的 iOS 和 macOS 的 API")
}
if语句的代码块仅仅在 iOS 10 或 macOS 10.12 及更高版本才运行。最后一个参数,*,是必须的,用于指定在所有其它平台中,如果版本号高于你的设备指定的最低版本,if语句的代码块将会运行