if
if 后面的条件可以省略小括号,条件只能是Bool类型
let age = 20
if age > 20 {
print("20多岁了")
}
else if age < 10 {
print("小孩子")
}
else {
print("年轻人")
}
// 以下写法将不会编译通过(if 条件只能是Bool类型)
if age {
}
while
repeat-while 相当于C语言的 do while
// while 循环
var num = 5
while num > 0 {
print("num is \(num)")
num -= 1
}
// repeat while 循环
var num2 = -1
repeat {
print("num is \(num2)")
} while num2 > 0
for
for 循环使用区间运算符
- 闭区间运算符:比如 0…3 代表大于等于0小于等于3
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for i in 0...3 {
print(names[i])
}
// 也可以将区间运算符定义为常量
let names = ["张三", "李四", "思聪", "尼古拉斯"]
let range = 0...3
for i in range {
print(names[i])
}
// 也可以区间运算符使用某一个变量\常量
let index = 0
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for i in index...3 {
print(names[i])
}
// i 默认是 let,也可以声明为 var 变量
for var i in 1...3 {
i+=5
print(i)
}
// 如果循环语句当中没有用到 i,可以写成 _ 表示忽略循环变量
for _ in 1...3 {
print("循环了")
}
- 半开区间运算符:比如a..<b 代表 大于等于a小于b
for i in 1..<3 {
print("循环了")
}
- 区间运算符应用在数组上:
let names = ["张三", "李四", "思聪", "尼古拉斯"] for name in names[0...3] { print(name) }
- 单侧区间:让区间向一个方向尽可能的远
// 下面这种写法代表从数组的第二个元素开始,一直遍历到数组的末尾
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for name in names[1...] {
print(name)
}
// 下面这种写法代表从数组的第1个元素开始,一直遍历到数组的第三个元素
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for name in names[...2] {
print(name)
}
// 半开区间,小于数组的第三个元素
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for name in names[..<2] {
print(name)
}
// 无穷区间(代表负无穷到小于等于5)
let range = ...5
range.contains(-1) // true
range.contains(6) // false
区间类型
区间类型分为三种:
- ClosedRange:闭合区间
let range1: ClosedRange<Int> = 1...3
- Range:半开区间
let range2: Range<Int> = 1..<3
- PartialRangeThrough:单侧区间
let range3: PartialRangeThrough<Int> = ...5
字符、字符串也能使用区间运算符, 但默认不能用在for-in中
// 字符串使用区间运算符(这种写法表示取值范围为:cc,cd,ce,cf....fe,ff)
let stringRange1 = "cc...ff" // 类型为ClosedRange<String>
stringRange1.contains("cb") // false
stringRange1.contains("dz") // true
// 也可以这样写
let stringRange2 = "a...f"
stringRange2.contains("c") // true
stringRange2.contains("z") // flase
// 声明区间类型为CloseRange<Character>, \0到~囊括了所有ASCII字符
let characterRange: ClosedRange<Character> = "\0"..."~"
characterRange.contains("G") // true
带间隔的区间值
let hours = 11
let hourInterval = 2
// tickMark的取值:从4开始,累加2,不超过11
for tickMark in stride(from: 4, through: hours, by: hourInterval) {
print(tickMark) // 输出 4 6 8 10
}
switch
case、default后面不能写大括号{}, 也可以不用写break(并不会贯穿到后面的条件)如:
var number = 1
switch number {
case 1:
print("number = 1")
break; // 也可以不用写break,不会贯穿到后面的条件执行
case 2:
print("number = 2")
break; // 也可以不用写break,不会贯穿到后面的条件执行
default:
print("number is other")
break; // 也可以不用写break,不会贯穿到后面的条件执行
}
// 打印结果:number = 1
fallthrough 可以实现贯穿效果
var number = 1
switch number {
case 1:
print("number = 1")
fallthrough
case 2:
print("number = 2")
default:
print("number is other")
}
// 打印结果number = 1 number = 2
switch语句必须要保证能处理所有情况,没有保证能够处理所有情况就会编译失败:
处理方法:case、default后面至少要有一条语句;如果不想做任何事情,加一个break即可
var number = 1
switch number {
case 1:
print("number = 1")
case 2:
print("number = 2")
default:
break
}
如果能够保证处理所有情况(比如枚举值),就不必使用default
enum Answer {case wrong, right}
let result = Answer.right
switch result {
case Answer.wrong:
print("你的答案错误了")
case Answer.right:
print("正确")
}
switch 也支持Character、String类型
let name = "jack"
switch name {
case "jack":
print("jack")
case "robin":
print("robin")
default:
break
}
// 也可以这样写,等同于贯穿执行
let name = "jack"
switch name {
case "jack", "robin":
print("jack,robin")
default:
break
}
区间匹配
let count = 62
switch count {
case 0:
print("0")
case 1..<5:
print("a few")
case 10..<100:
print("dozens of")
case 100..<1000:
print("hundreds of")
default:
break
}
元组匹配
let point = (1, 1)
switch point {
case (0, 0):
print("origin")
case (_, 0): // 代表左边是什么值都行
print("x-axis")
case (0, _): // 代表右边是什么值都行
print("y-axis")
case (-2...2, -2...2):
print("inside the box")
default:
print("outside")
break
}