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

简介: 文章目录1.流程控制1.1 while循环eg1. 简单的打印例子1

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


相关文章
|
3月前
|
Swift iOS开发 Kotlin
苹果iOS新手开发之Swift中实现类似Kotlin的作用域函数
Swift可通过扩展实现类似Kotlin作用域函数效果。如自定义`let`, `run`, `with`, `apply`, `also`,增强代码可读性和简洁性。虽无直接内置支持,但利用Swift特性可达成相似功能。
51 7
|
4月前
|
Swift C++ 索引
Swift开发——简单函数实例
函数是编程的基础,用于封装特定功能的代码。它们有关键词func、函数名、参数列表(可为空)和返回类型。多返回值可通过元组、数组、inout参数或可选类型实现。例如,返回元组 `(value1, value2)`,数组 `[value1, value2]` 或使用可选数组 `[[Double]]?`。函数可以作为其他函数的参数,类似闭包或Lambda表达式。在Swift中,示例展示了通过元组、带索引的元组、数组和可选类型返回多个值的函数。还演示了如何使用inout参数交换变量值。
74 5
Swift开发——简单函数实例
|
5月前
|
缓存 Swift UED
【Swift开发专栏】Swift应用的启动优化
【4月更文挑战第30天】本文介绍了Swift应用启动优化技巧,包括优化代码结构和资源加载。建议减少启动时加载的代码,采用延迟加载、分模块加载和懒加载策略;优化初始化代码,注意顺序、异步初始化和避免全局初始化。对于资源,压缩图片、使用矢量图和图片缓存可提升加载速度。文中还提供了实战案例,展示如何在代码中实施这些优化措施。
94 1
|
5月前
Swift4.0判断本函数是否在其它类有相同的方法
Swift4.0判断本函数是否在其它类有相同的方法
39 0
|
5月前
|
安全 编译器 Swift
【Swift开发专栏】Swift的编译优化与构建配置
【4月更文挑战第30天】Swift编译优化与构建配置对开发效率和应用性能至关重要。编译优化包括不同级别的优化、函数内联、泛型特化、尾递归优化、死代码消除和链接时优化。在Xcode的&quot;Build Settings&quot;中可调整相关标志。构建配置涉及Debug与Release模式、自定义配置、条件编译、构建设置和脚本。开发时,应适时测试、选择适当优化级别、避免过度优化,并利用条件编译区分不同版本的代码。有效管理构建设置可提升开发质量和性能。
72 0
|
5月前
|
存储 API Swift
【Swift开发专栏】Swift函数与闭包的实战应用
【4月更文挑战第30天】本文介绍了 Swift 中函数和闭包的实战应用。首先,函数的基本使用包括定义、参数与返回值、函数类型以及高级技巧如嵌套函数。接着,讨论了闭包的语法,包括无名函数、作为函数参数、简写形式和尾随闭包。最后,展示了函数和闭包在实战中的应用,如排序过滤集合和处理异步任务的回调。
37 0
|
5月前
|
存储 Swift
Swift 语言:什么是闭包(Closure)?它们与函数的区别是什么?
Swift 语言:什么是闭包(Closure)?它们与函数的区别是什么?
104 1
|
5月前
|
Swift
Swift中的函数
Swift中的函数
39 1
|
5月前
|
存储 Swift
Swift中,函数和闭包
Swift中,函数和闭包
57 1
|
12月前
|
Swift iOS开发
23 Swift中如何定义和使用函数
Swift中如何定义和使用函数
80 0
下一篇
无影云桌面