说明:用来完成特定任务的独立的代码。
- 从简单到复杂:既可以定义最简单的没有参数名字的 C 风格函数,也可以定义复杂的带局部和外部参数名的 Objective-C 风格函数
- 默认参数值:参数可以提供默认值,以简化函数调用
- In-out参数:参数前加
&
符,表示这个值可以被函数修改(只能针对变量参数,类似传引用)- 当作普通变量:可以把函数类型当做任何其他普通变量类型一样处理
- 嵌套:函数的定义可以写在在其他函数定义中
6.1 定义
定义:使用
func
关键字
- 函数名:描述函数执行的任务
- 参数:可以定义一个或多个有名字和类型的值,作为函数的输入
- 返回值:可以定义某种类型的值作为函数执行结束的输出
1 | func sayHelloAgain(personName: String) -> String { |
6.1.1 参数
说明:特点总结
- 参数数量:参数可以没有、1个或多个(用
,
分隔)- 参数名:包括外部参数名(为了调用时的可读性)和内部参数名(内部调用)
- 默认参数值:当默认值被定义后,调用这个函数时可以忽略这个 参数
- 定义可变参数:可以用可变参数来传入不确定数 量的输入参数
- 常量参数:函数参数默认是常量,在函数体中不能修改
- 变量参数:可以在函数中把它当做新的可修改副本来使
用
6.1.1.1 参数数量和类型
说明:参数具有以下特点
- 数量:可以有0个或多个输入参数
- 类型:可以有多种类型的输入参数
类型 | 参数数量 | 参数类型 |
---|---|---|
无参函数 | 0 | |
多参量函数 | 大于1 | 多种类型 |
1 | // 无参函数 |
6.1.1.2 参数名
说明:包括
内部参数名
和外部参数名
特点 | 说明 | 备注 |
---|---|---|
内部参数名 | 在函数被调用时,函数内部用来访问参数相应副本 | 所有参数都必须有 |
外部参数名 | 往函数的调用语句中传递参数时使用 | 第一个参数可以指定,其它参数要么指定一个外部参数名,要么就默认和内部参数名相同(除非使用_ 声明不指定外部参数名) |
1 | // 指定外部参数名 |
6.1.1.2 默认参数值
语法:
部参数名: 参数类型 = 默认值
1 | func someFunction(parameterWithDefault: Int = 12) { |
技巧:将带有默认值的参数放在函数参数列表的最后。这样可以保证在函数调用时,非默认参数的顺序是一致的,同时使得相同的函数在不同情况下调用时显得更为清晰。
6.1.1.3 可变参数
说明:可以用可变参数来指定函数参数可以被传入不确定数量的输入值。
- 可变参数的传入值在函数体中变为此类型的一个数组
- 一个函数
最多只能有一个
可变参数- 如果函数有一个或多个带默认值的参数,而且还有一个可变参数,那么把可变参数放在参数表的最后
语法:
部参数名: 参数类型 ...
1 | func arithmeticMean(numbers: Double...) -> Double { |
6.1.1.4 常量参数和变量参数
说明:对于
值类型
(class
之外的所有类型),无论常量参数
还是变量参数
,函数使用的都是副本。
分类 | 副本是否可以修改 | 语法 | 备注 |
---|---|---|---|
常量参数 | 否 | 默认 | |
变量参数 | 是 | var 参数名: 参数类型 |
仅存在于函数调用的声明周期中,调用结速后修改便消失了 |
1 | /** |
6.1.2.5 输入输出参数
关键字:
inout
(声明函数时使用)
操作符:&
(调用函数时使用)
说明:相当于将原本针对值类型默认的传值
转变为传引用
。
- 只能传递
变量
给输入输出参数
(不能传入常量
或者字面量
)- 不能用于
带默认值的参数
和可变参数
- 参数被
inout
标记后就不能再被let
或var
标记扩展:函数对函数体外进行影响的两个方式
- 返回值
- 输入输出参数
1 | /** |
6.1.2 返回值
声明返回值语法:
func 函数名 () -> 返回值类型 {...}
说明:分为3种情况
返回值 | 说明 | 备注 |
---|---|---|
无 | 严格说来函数依然返回了值Void (空元组) |
|
一个返回值 | 任意类型 | |
多个返回值 | 用元组让多个值作为一个符合值返回 | 也可以是可选型元组 |
注意:函数一旦设置了返回值,则必须通过
return
返回相应类型的返回值。
无返回值函数
说明:声明方式有3种
- 省略
-> 返回值类型
-> Void
-> ()
1 | // 无返回值 |
返回元组
技巧:声明返回的元组时,为每一项设置名字,以便通过名字访问每一项。
1 | /** |
返回可选型元组
语法:
-> (...)?
应用:当返回的元组可能是一个nil
值时必须将返回的元组定义为可选型
1 | /** |
6.2 函数类型
说明:函数的类型由函数的
参数类型
和返回值类型
决定。项其它类型一样:
- 常量或变量:可以定义一个类型为函数的常量或变量,并将函数赋值给它
- 赋值:如果变量或常量是某种函数类型,那么只有匹配的函数才能进行赋值
- 类型推断:当赋值一个函数给常量或变量时,Swift可以推断其函数类型
- 作为参数
- 作为返回值类型
6.2.1 基本使用
1 | // 函数类型:(Int, Int) -> Int |
6.2.2 作为参数
1 | // 作为参数 |
6.2.3 作为返回值
1 | // 作为返回值 |
6.3 嵌套函数
说明:定义在其他函数中的函数。
- 对外界不可见
- 可以通过被函数返回使其对外界可见
1 |