函数
定义和调用函数
定义了一个函数的时候,你可以选择定义一个或者多个命名的分类的值作为函数的输入(所谓的形式参数),或者定义函数完成后将要传回作为输出的值的类型(所谓它的返回类型)。
func add(num1: Int, num2: Int) -> Int {
return num1 + num2;
}
add(num1: 1, num2: 2)
函数的形式参数和返回值
- 无参数、无返回值
func noReturnAndParameter() {
return;
}
- 无参数有返回值
func noParameter() -> Int {
return 1
}
- 有参数无返回值
func noReturn(a: Int) {
}
- 有参数有返回值
func add(num1: Int, num2: Int) -> Int {
return num1 + num2;
}
- 有多个返回值的函数(返回元组)
func getReuslt() -> (Int, Double, String) {
return (1, 1.1, "string")
}
函数使用的注意事项
外部参数和内部参数
外部参数
:在函数外部可以看到的参数
内部参数
:在函数内部可以看到的参数
func add(num1: Int, num2: Int) {
// 函数内部可以使用的参数,就是内部参数
print(num1 + num2)
}
// 在外面可以看到的参数
add(num1: 1, num2: 2)
注: Swift3.0开始,默认情况下第一个参数开始,参数名既是内部参数也是外部参数。
指定实际参数标签
在提供形式参数名之前写实际参数标签,用空格分隔:
func greet(person: String, from hometown: String) -> String {
return "Hello \(person)! Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// Prints "Hello Bill! Glad you could visit from Cupertino."
如果对于函数的形式参数不想使用实际参数标签的话,可以利用下划线 _
来为这个形式参数代替显式的实际参数标签。
func addFile(_ sourcePath: String, to finalPath: String) {
}
addFile("xxx", to: "xxxx")
默认参数
如果没有传入具体参数,可以使用默认参数。
如果使用默认值,那么函数的参数可以使必传参数和可传参数的任意组合
// 如果外界没有传入值,则使用默认值
func addNum(num1: Int, num2: Int = 0) -> Int {
return num1 + num2
}
addNum(num1: 1)
addNum(num1: 1, num2: 2)
可变参数
一个可变形式参数可以接受零或者多个特定类型的值。当调用函数的时候你可以利用可变形式参数来声明形式参数可以被传入值的数量是可变的。可以通过在形式参数的类型名称后边插入三个点符号 ...
来书写可变形式参数。
func add(_ nums: Int...) -> Int {
var result = 0
for num in nums {
result += num
}
return result
}
add(1)
add(1, 2)
一个函数最多只能有一个可变形式参数。
输入输出形式参数
函数能够修改一个形式参数的值,而且想这些改变在函数结束之后依然生效,那么就需要将形式参数定义为输入输出形式参数
。
在形式参数定义开始的时候在前边添加一个 inout
关键字可以定义一个输入输出形式参数。输入输出形式参数有一个能输入给函数的值,函数能对其进行修改,还能输出到函数外边替换原来的值。
输入输出形式参数不能有默认值,可变形式参数不能标记为 inout,如果你给一个形式参数标记了 inout,那么它们也不能标记 var和 let了。
func change(_ num: inout Int) {
num = 11
}
var a = 1
change(&a)
函数的嵌套
可以在函数的内部定义另外一个函数。这就是内嵌函数。
内嵌函数在默认情况下在外部是被隐藏起来的,但却仍然可以通过包裹它们的函数来调用它们。包裹的函数也可以返回它内部的一个内嵌函数来在另外的范围里使用。
func test() {
func test2() {
print("2222222")
}
print("xxxxxx")
test2()
}
test()
函数的类型
每一个函数都有一个特定的函数类型,它由形式参数类型,返回类型组成。
用途:
- 作为另一个函数的参数/返回值
// 作为参数
func add(_ num1: Int, _ num2: Int) -> Int {
return num1 + num2
}
func example(n1: Int, n2: Int, addFunc: (Int, Int) -> Int) {
let result = addFunc(n1, n2)
print(result)
}
example(n1: 1, n2: 1, addFunc: add)
- 作为另一个函数的返回值
// 作为返回值
func getFunc(name: String) -> (Int, Int) -> Int {
if name == "add" {
return add
}
return add
}
let fun = getFunc(name: "add")
fun(1, 3)