swift - 函数

函数声明

func 函数名(参数1, 参数2 ... ) -> 返回值类型

参数名

参数名分为内参名和外参名。外参名是给调用者用的标签,内参名是函数内代表参数的名字。

完整的函数名
//声明
func area(length l : Int, width w : Int) -> Int {
    return l * w;
}
//完整的函数名
area(length : width :)
//调用
let a = area(length : 2, width : 3)

其中length和width是外参名,l和w是内参名

非显示的外参名
//声明
func area(length : Int, width : Int) -> Int {
    return length * width
}
//函数名
area( _  width : )
//调用
let a = area(2, width : 3)
没有外参名
//声明
func area(length : Int, _ width : Int) {
    return length * width
}
//函数名
area( _ : _ : )
//调用
let a = area(2, 3)
没有函数
func no_param_function(_ : Void)

括号中的内容不能去掉

返回值类型

返回Void
返回多个数据时可以使用元组
func parseStringToDate(string str : String) -> (day : Int, month : String, year : Int) {
    ...
    return (day : d, month : m, year : y)
}
let (d, m) = parseStringToDate(string : str)
返回optionals时使用nil表示失败

参数属性

设置参数默认值
func area(length : Int, width : Int = 2) -> Int

带默认值的参数必须是最后一个参数

optional参数

使用这个参数时要结合if let

参数值可变量

默认情况下,函数的参数是按值传递的,参数到了函数内部会拷贝一份再使用。也就是说,函数内对参数的改变不影响函数外的调用者。
如果希望改变,可以有两种方法:
1.var关键字

func area(var length : Int, width : Int) -> Int {
    length = length + 1
    return length
}
var length = 2
length = area(length, width : 2)

说明:使用var的参数仍然是按值拷贝,但是在函数结束时它会再拷贝一份出来

2.inout关键字

func area(inout length : Int, _ width : Int) -> Int {
    length = length + 1
    return length * width
}
var length : Int = 1
let a = area(&length, 3)

说明:
inout关键字与默认值不能同时使用
使用inout后会以引用方式传参

参数个数

func recipe(title t : String, ingredients : String ...) -> String {
    for ing in ingredients {
        ...
    }
    ...
}
let page = recipe(title : "title", ingredients : "aaa", "bbb", "ccc")

说明:
ingredients是一个String类的数组,后面的可变个数的参数都必须是String的
可变长参数必须是最后一个参数