if-else 条件语句
- 在 Swift 中,
if
后面的条件可以省略小括号 -
if
后面的条件只能是Bool
类型(区别于OC的,零为假,非零为真)
let age = 20
if age >= 18 {
print("成年人");
}
循环:while、repeat-while、for
- 同 if 条件语句一样,循环条件可以省略小括号
-
repeat-while
相当于 C/OC 语言中do-while
注意:从 Swift 3 开始,去除了自增(++)、自减(--)运算符,是因为可读性不好。(如:++age + ++age,可读性不好,在不同编译器会有不同的效果)
var num = 5
while num > 0 {
print("num is \(num)")
num -= 1 // 注意:这里不能写 num--。
} // 打印了5次
var count = -1
repeat {
print("count is \(count)")
} while count > 0 // 打印了1次
- 以前 C/OC 中的 for 循环写法:三段式
for (int i = 0; i < 5; i++) {
}
- 常见遍历数组
// 1. 遍历数组
let names = ["张三", "李四", "王五", "赵六"]
for i in 0...3 {
print(names[i])
} // 张三 李四 王五 赵六
// 2. 遍历数组
let names = ["张三", "李四", "王五", "赵六"]
for name in names {
print(name)
} // 张三 李四 王五 赵六
- Swift 中的 for 循环写法:区间式
1)闭区间运算符:a...b
(a ≤ 取值 ≤ b)
2)半开区间运算符:a..<b
(a ≤ 取值 < b),a<..b
(a < 取值 ≤ b)
3)单侧区间运算符:a...
(a ≤ 取值),...b
(取值 ≤ b),..<b
(取值 < b);就是让区间朝一个方向尽可能的远,可能是无穷远,也可能是数组的长度。
let names = ["张三", "李四", "王五", "赵六"]
for i in 0...3 {
print(names[i])
} // 张三 李四 王五 赵六
let range = 1...3
for i in range {
print(names[i])
} // 李四 王五 赵六
let a = 1
let b = 2
for i in a...b {
print(names[i])
} // 李四 王五
// i 默认是 let,有需要时可以声明为 var,可以对 i 的值进行修改
for var i in 1...3 {
i += 5
print(i)
} // 6 7 8
// 如果 for 循环中用不到 i,可以写成“_”表示忽略
for _ in 0...3 {
print("for")
} // 打印了3次
// 半开区间运算符:1 ≤ 取值 < 5
for i in 1..<5 {
print(i)
} // 1 2 3 4
// 区间运算符用在数组上
let names = ["张三", "李四", "王五", "赵六"]
for name in names[0...3] {
print(name)
} // 张三 李四 王五 赵六
// 由于数组边界的限制,区间等价于: [0...3]
for name in names[...3] {
print(name)
} // 张三 李四 王五 赵六
// 带间隔的区间值
let min = 4
let max = 11
let interval = 2
// i 的取值:从4开始,累加2(即间隔2),不超过11
for i in stride(from: min, through: max, by: interval) {
print(i)
} // 4 6 8 10
区间类型
除了Int类型的区间,字符、字符串也能使用区间运算符,但默认不能用在 for-in 中
区间也有类型,如:
// 1.闭区间
let range1: CloseRange<Int> = 1...3
let range1 = 1...3 // 简写
// 2.半开区间
let range2: Range<Int> = 1..<3
let range2 = 1..<3 // 简写
// 3.单侧区间
let range3: PartialRangeThrough<Int> = ...3
let range3 = ...3 // 简写
// 判断区间内是否包含某个值
range3.contains(8) // fasle
range3.contains(-2) // true
// 除了Int类型的区间,字符、字符串也能使用区间运算符,但默认不能用在 for-in 中
let strRange: CloseRange<String> = "dd"..."ff"
let strRange = "dd"..."ff" // 简写
// 判断区间内是否包含某个值
strRange.contains("cb") // fasle
strRange.contains("df") // true
// 128个ASCII字符:"\0"..."~"
let charRange: ClosedRange<Character> = "a"..."z"
charRange.contains("g") // true
switch 语句
- 注意事项:
1)case、default 后面不能写大括号{}
2)默认可以不写break,并不会贯穿到后面的条件,编译器会帮我们写上
3)使用 fallthrough 可以实现向下贯穿的效果
4)swift 比较安全严谨,在 switch 中必须要处理完所有的逻辑情况(即一般情况 default 不能省略;如果能保证已处理所有情况,也可以省略 default)
5)case、default 后面至少要有一条语句。如果没有,可以写 break。
var number = 1
switch number {
case 1:
print("number is 1")
break // break 可以省略不写
case 2:
print("number is 2")
break // break 可以省略不写
default:
print("number is other")
break // break 可以省略不写
}
// 打印结果:
// number is 1
- 简写版本
var number = 1
switch number {
case 1:
print("number is 1")
fallthrough // 因为默认有break,不会向下贯穿;加上 fallthrough 可以实现向下贯穿的效果
case 2:
print("number is 2")
default:
print("number is other")
}
// 打印结果:
// number is 1
// number is 2
- case 已包含所有情况时,可以省略 default
// 定义枚举类型
enum Sex { case male, female }
let sex = Sex.male
switch sex {
case .male: // Sex.male 的简写(因为已确定 sex 是 Sex 类型)
print("男性")
case .female: // Sex.female 的简写
print("女性")
/*
// 由于上面已包含所有情况,所以可以省略 default
default:
break
*/
}
- 复合条件(即是向下贯穿执行多个条件):
switch 支持字符、字符串类型
// 1.switch 支持 String 类型
let string = "Jack"
switch string {
case "Jack":
fallthrough // 向下贯穿
case "Rose":
print("Right person")
default:
break
} // Right person
// 复合条件合并写法
switch string {
case "Jack", "Rose":
print("Right person")
default:
break
} // Right person
// 2.switch 支持 Character 类型
let char: Character = "a"
switch char {
case "a", "A":
print("The letter A")
default:
print("Not the letter A")
} // The letetr A
- switch 区间匹配
let count = 62
switch count {
case 0:
print("none")
case 1..<5:
print("a few")
case 5..<12:
print("serveral")
case 12..<100:
print("dozens of")
case 100..<1000:
print("hundreds of")
default:
print("many")
} // dozens of
- switch 元组匹配
// 判断某个点是否在正方形内部
let point = (1, 1)
switch point {
case (0, 0):
print("原点")
case (_, 0): // 可以使用下划线_忽略某个值
print("在X轴上")
case (0, _):
print("在y轴上")
case (-2...2, -2...2):
print("在正方形盒子内部")
default:
print("在正方形盒子外部")
} // 在正方形盒子内部
// 值绑定
let point = (2, 0)
switch point {
case (let x, 0):
print("点(\(x), 0)在x轴上")
case (0, let y):
print("点(0, \(y))在y轴上")
case let (x, y):
print("(x, y) = (\(x), \(y))")
} // 点(2, 0)在x轴上
- 关于 switch 中 case 匹配的问题,属于模式匹配的范畴。
where 条件
// 1.在 case 后面使用 where
let point = (1, -1)
switch point {
case let(x, y) where x == y:
print("on the line x == y")
case let(x, y) where x == -y:
print("on the line x == -y")
case let(x, y):
print("(\(x), \(y)) is just some arbitrary point")
} // on the line x == -y
// 2.在 for循环 后面使用 where
var numbers = [10, 20, -10, -20, 30, -30]
for num in numbers where num > 0 { // 使用 where 来过滤 num,只遍历大于零的正数
print(num);
} // 10 20 30
// 注意:
// 满足后面的 where 条件时就执行大括号里的内容
// 不满足时并不会终止循环,会自动进入下一次循环
// where 的作用相当于 continue,而不是break
标签语句
// 标签的作用:默认 continue、break 控制的是内层循环,使用标签可以修改成控制外层循环
outer: for i in 1...4 {
for j in 1...4 {
if j == 3 {
continue outer
}
if i == 3 {
break outer
}
print("i == \(i), j == \(j)")
}
}