概述
函数是一段执行特定任务的独立的代码块,可以通过函数名来调用这个函数,传递参数给它并获取返回的结果。
定义和调用函数
使用func
创建函数:
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
在上述例子中,()
内是函数接收的参数及其数据类型,->
后面是函数返回的结果的数据类型。return
返回一个值作为结果并退出函数。如果函数没有返回值,也可以用return
直接退出,->
及后面的数据类型省略。
调用函数时,在函数名后面的()
内传递参数,如果有多个参数就用,
隔开:
let res = greet(person: "Anna")
如果函数需要返回多个结果,可以将它们放在一个元组中:
func minMax(array: [Int]) -> (min: Int, max: Int) {
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value = currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
该元组中的成员会根据函数定义中返回值的名称命名,所以可以通过.
和名称来访问:
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
实际参数标签和形式参数名
形式参数由实际参数标签和形式参数名组成,调用函数时,可以通过实际参数标签和:
指定要将参数传递给哪个实参。如果省略了实际参数标签,则用形式参数名作为实际参数标签。
from greet(person: String, from hometown: String) -> String {
return "Hello \(person)! Glad you could visit from \(hometown)"
}
print(greet(person: "Bill", from: "Cupertino"))
上面例子中,调用时函数传递给了实际参数标签from
,但是函数内部处理的变量是hometown
,这样可以让函数的调用更加明确,更像自然语句。
如果不希望使用实际参数标签,可以用_
显式替换它,这样在调用函数时,传入的参数就会按照顺序一一对应赋给形参。
这里可以理解为,Swift 的参数默认都是关键字参数,和其他语言不同的是每个参数的关键字和名称可以是不一样的,而用_
替换掉关键字的才是其它语言中默认的参数形式。
默认参数
用=
为参数赋一个默认值,就可以在调用时不为这个参数传递一个值,进而使用这个默认值。
func someFunction(age: Int = 12) -> String {
return "He is \(age)-yeas-old"
}
可变参数
可变参数可以接收 0 或多个特定类型的值,通过在形参的类型名后加...
实现。
func average(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
let res = average(1, 2, 3, 4, 5)
输入输出参数
如果希望函数内对参数的修改在函数结束之后仍然生效,可以在形参的类型前面加inout
,并在调用函数时在参数前面加&
。
func swap(a: inout Int, b: inout Int) {
let temp = a
a = b
b = temp
}
var a = 12
var b = 13
swap(&a, &b)
函数类型
函数也具有类型,所以它也可以像其它类型的变量一样作为函数的参数或返回值。通常将参数的类型放在()
里并用,
隔开,再把返回值类型放在->
后面以表示函数的类型,例如函数接收两个Int
类型的参数并返回一个Int
类型的结果,它的类型就可以写作(Int, Int) -> Int
。
如果函数没有返回值,就用Void
代替。
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
内嵌函数
函数内部可以定义内嵌函数,它们默认被隐藏,但可以通过外部函数来调用它们。
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backward ? stepBackward : stepForward
}