一个函数基本包含几个部分,分别为关键字func、函数名称、参数列表(参数名称和参数类型)、函数返回类型、函数体。
func functionName(external_paramName local_paramName: paramType, ...) -> ReturnType {
// 函数体
}
当调用超过一个参数的函数时,对于第二个开始的参数必须用对应的外部参数名标记,除非显式地将外部参数名定义为空。
可以使用元祖类型作为一个函数的返回类型,这样一个函数就可以返回多个值了。对于特殊情况,还可以设置该返回类型为可选元祖类型。
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
// ...
}
函数参数名称可以定义一个外部参数名和一个本地参数名。顾名思义,外部参数名用于标记外部传入的参数,而本地参数名用于函数内部的访问。默认地,第一个参数会自动忽略它的外部参数名,第二个及之后的参数自动使用它们的本地参数名作为它们的外部参数名。所有的参数必须有一个唯一的本地名称,对于外部参数名,可以几个参数拥有相同的外部参数名,但是不建议这样定义。
func someFunction(firstParameterName: Int, secondParameterName: Int) {
// 对于第一个参数,其外部参数名为空,用'_'表示,其本地参数名为firstParameterName
// 对于第二个参数,其外部参数名为secondParameterName,其本地参数名为secondParameterName
// 函数体
}
需要注意的是,若为一个参数指定了一个外部参数名,则在调用函数时必须使用该外部参数名表示参数,对于第一个参数也不例外。
如果你实在不想使用外部参数名,那么在定义外部参数名时使用下划线_代替外部参数名,这样在调用函数时就不需要使用外部参数名标记参数了。正如上面提到的,Swift默认忽略函数第一个参数的外部参数名,也就是说对于第一个参数,不需要显式地用下划线_代替其外部参数名。
func someFunction(firstParameterName: Int, _ secondParameterName: Int) {
// 函数体
}
你可以给任何一个参数指定其默认值,这样在调用函数时可以忽略提供默认值的参数。注意,将带有默认值的参数放到参数列表的最后。
func someFunction(parameterWithDefault: Int = 12) {
}
对于变长参数,允许接受零个或多个指定类型的值。变长参数在函数体中作为一个常量数组使用。
Swift规定在参数类型后加入三个句号.用于定义变长参数。注意,一个函数最多只有一个变长参数。
func arithmeticMean(numbers: Double...) -> Double {
// 函数体
}
arithmeticMean(1, 2, 3, 4, 5) // 调用函数
函数参数对于函数体来说默认为常量,也就是,试图在函数体内改变参数值是不允许的,会引起编译时错误。
然而,有时候声明一个变量参数也是很有意义的,这样我们就不需要在函数体内再去声明一个变量用于跟踪参数值的变化了。
Swift规定在参数名称前标记关键字var用于定义变量参数,同样,用关键字let用于定义常量参数。值得注意的是,变量参数的变化只在函数体内有效,函数外部依旧保持参数传入时的值。
func alignRight(var string: String, totalLength: Int, pad: Character) {
// 函数体
}
let originalString = "hello"
let paddedString = alignRight(originalString, totalLength: 10, pad: "-")
// 代码运行到此处,originalString值依旧为"hello"
何谓输入输出参数,也许翻译的有点死板,叫做可变参数更为恰当点,但是为了跟上面的变长参数和变量参数区分开来,我们暂时就叫它输入输出参数。
从字面上可以理解,输入输出参数负责将数据传入函数体,并且在函数结束时将数据传出函数体。
Swift规定在参数名称前标记关键字inout来定义输入输出参数。
func swapTwoInts(inout a: Int, inout _ b: Int) {
// 函数体
}
在给输入输出参数赋值时需要注意以下几点:
只能使用变量赋值,常量和字面量是不允许修改的。
在赋值的变量名前添加与符号'&',指示该变量在函数中会被改变。
不允许带默认值。
不允许标记为变长参数。
不能标记为常量参数或变量参数。
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
// 代码运行到此处,someInt值为107,anotherInt值为3
函数类型,顾名思义,就是标示一个函数的特性,它由参数类型和返回类型组成。
可以使用函数类型声明常量、变量,或作为函数参数类型、函数返回类型。
let mathFunction: (Int, Int) -> Int
var mathFunction: (Int, Int) -> Int
func printMathResult(mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
// 函数体
}
func chooseStepFunction() -> (Int) -> Int {
// 函数体
}