1.流程控制
1.1 while循环
eg1. 简单的打印例子1
var num = 10 while num > 0 { print("num is \(num)") num -= 1 } // 打印num 5次
eg2.简单的打印例子2
var num = -1 repeat { print("num is \(num)") }while num > 0 // 打印了1次num
repeat-while 相当于C语言的do-while
1.2 for循环
1.2.1 区间运算符
闭区间运算符:a…b, a <= 取值 <= b
半开区间运算符:a…
单侧区间:让区间朝一个方向尽可能远, 2…
eg1.遍历列表
let names = ["MM", "YY", "HH", "HM"] for i in 0...3 { print(names[i]) } // MM YY HH HM(一行一个名字)
上述代码中,for循环中的i默认是let,也就是在大阔号中没有办法更改i的值。如需更改,则只需要将i显式声明为var。
for var i in 0...3 { i += 10 print(i) } // 10 11 12 13
eg2. 区间运算符在数组上的使用
let names = ["MM", "YY", "HH", "HM"] for name in names[0...3] { print(names[item]) } MM YY HH HM(一行一个名字)
1.3 switch语句
switch必须要保证能处理所有情况
case、default后面至少要有一个语句
在swift中默认可以不写break,在switch语句中并不会贯穿到下面的条件,如下代码块儿,输出为1。
var num = 1 switch num { case 1: print("1") case 2: print("2") default: print("other") } // 1
1.4 fallthrough语句
fallthrough可以实现贯穿效果,如下代码块儿,输出为1、2。
var num = 1 switch num { case 1: print("1") fallthrough case 2: print("2") default: print("other") } // 1 2
1.5 区间匹配、元组匹配与值
区间匹配
let num = 21 switch num { case 0: print("0") case 1..<10: print("[1,10)") case 10..<21: print("[10,21)") case 21..<30: print("[21,30)") default: print("other") } // [21,30)
元组匹配
let point = (1, 1) switch point { case (0, 0): print("the origin") case (_, 0): print("on the x-axis") case (0, _): print("on the y-axis") case (-2...2, -2...2): print("inside the box") default: print("outside of the box") } // inside the box
值绑定
l
et point = (2, 1) switch point { case (let x, 1): print("x = \(x)") case (1, let x): print("x = \(x)") default: print("other") } // x = 2
1.6 where语句
where用于添加约束条件,我们来看下面这个例子:
let point = (1, 1) switch point { case let (x, y) where x == y: print("x == y") case let (x, y) where x == -y: print("x == -y") default: print("other") } // x == y
eg1.求列表的正数和
本例中,将在for循环中添加where语句,实现求正数和
var numbers = [-3, -2, -1, 0, 1, 2, 3] var sum = 0 for number in numbers where number > 0{ sum += number } print(sum) // 6
2.函数
2.1 函数的定义
有返回值的情况
func pi() -> Double{ return 3.1415926 } print(pi()) // 3.1415926 func sum(n1: Int, n2: Int) -> Int{ return n1 + n2 } print(sum(n1: 1, n2: 5)) // 6
注意:形参默认let, 只能为let
无返回值的情况
func say1() -> Void{ print("你好1") } func say2() -> (){ print("你好2") } func say3(){ print("你好3") }
2.2 隐式返回
如果整个函数是一个单一表达式,那么函数就会返回这个表达式
func sum(n1: Int, n2: Int) -> Int{ n1 + n2 } print(sum(n1: 1, n2: 5)) // 6
2.3 实现多返回值
这里用一个例子来说明,下面的程序用一个函数实现了求和、平均数的功能:
2.4 参数标签
func caculate(n1: Int, n2: Int) -> (sum: Int, average: Double){ let sum = n1 + n2 let average = Double(sum) / 2 return(sum, average) } let result = caculate(n1: 10, n2: 5) print("sum = \(result.sum)") // sum = 15 print("average = \(result.average)") // average = 7.5
修改参数标签,如下,标签函数内为time,函数外为at
func goToStudy(at time: String){ print("This time is \(time), we should go to study now!") } goToStudy(at: "06:00") // This time is 06:00, we should go to study now!
使用 _ 省略参数标签
func caculate(_ n1: Int, _ n2: Int) -> (sum: Int, average: Double){ let sum = n1 + n2 let average = Double(sum) / 2 return(sum, average) } let result = caculate(10, 5) print("sum = \(result.sum)") // sum = 15 print("average = \(result.average)") // average = 7.5
2.5 函数参数默认值
显式在形参列表中添加默认值即可:
func say(girl: String = "Lingling", boy: String = "xiaoming"){ print("\(girl) and \(boy) is a good friend!") } say(girl: "Miao") // Miao and xiaoming is a good friend! say() // Lingling and xiaoming is a good friend! say(boy: "Huang") // Lingling and Huang is a good friend!
2.6 输入输出参数
使用inout定义一个输入输出参数,可以在函数内部修改外部实参的值
可变参数不能设置为输入输出参数
能设置为输入输出参数的一定能被多次赋值
下面是一个简单的更改外部参数的程序,将外部变量num通过函数修改为10:
var num = 0 func test(_ num: inout Int){ num = 10 } test(&num) print(num) // 10
2.7 可变参数
一个函数最多只能有一个可变参数
紧跟在可变参数后面的参数不能省略参数标签
我们用一个简单的求和函数来说明:
func sum(_ numbers: Int...) -> Int{ var sum = 0 for number in numbers{ sum += number } return sum } sum(1, 2, 3, 4, 5) // 15
2.8 函数重载的概念
函数名相同但是:
参数个数不同;
参数类型不同;
参数标签不同。
3.内联优化(内联函数)
内联优化其实就是函数展开成代码,通过优化减少资源的占用。但是如下情况不会被优化:
函数体比较长
包含递归调用
包含动态派发
func test(){ print("123") } test() // 123 // 由于方法体只有一个打印语句,编译器便不再调用test(),而是通过内联优化直接print print("123") // 123