本文对swift的流程控制相关内容以及函数要点进行了归纳总结,适合初学者。
文章目录
- 1.流程控制
- 1.1 while循环
- eg1. 简单的打印例子1
- eg2.简单的打印例子2
- 1.2 for循环
- 1.2.1 区间运算符
- eg1.遍历列表
- eg2. 区间运算符在数组上的使用
- 1.3 switch语句
- 1.4 fallthrough语句
- 1.5 区间匹配、元组匹配与值
- 1.6 where语句
- eg1.求列表的正数和
- 2.函数
- 2.1 函数的定义
- 2.2 隐式返回
- 2.3 实现多返回值
- 2.4 参数标签
- 2.5 函数参数默认值
- 2.6 输入输出参数
- 2.7 可变参数
- 2.8 函数重载的概念
- 3.内联优化(内联函数)
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…<b, a <= 取值 < b
- 单侧区间:让区间朝一个方向尽可能远, 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
- 值绑定
let 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 实现多返回值
这里用一个例子来说明,下面的程序用一个函数实现了求和、平均数的功能:
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
2.4 参数标签
- 修改参数标签,如下,标签函数内为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
— end
本文到此就告一段落了,后续还会继续更新swift与swiftUI相关知识,收藏专栏不迷路~