网络知识 娱乐 【Swift 5.1】流程控制、函数与内联函数优化

【Swift 5.1】流程控制、函数与内联函数优化

swift

本文对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相关知识,收藏专栏不迷路~