func的参数修饰符

参数默认是 let 类型的

一般省略函数参数的修饰符 ,我们并没有指定它是什么类型

1
2
3
func incrementor(variable: Int) ->Int{
return variable + 1
}

默认是 let ,比如下面的是错误代码 , 因为 let 不可变

1
2
3
func incrementor(variable: Int) ->Int{
return ++variable
}

仔细看错误提示:
Mark parameter with 'var' to make it mutable

需要显式写 var

1
2
3
func incrementor(var variable: Int) ->Int{
return ++variable
}

inout

函数参数是值传递,就是说,不会改变外部参数的值,比如:

1
2
3
var number = 7
let newNumber = incrementor(number)
number

newNumber是 8 , number 还是 7 .

如果想要修改,那么就应该加上 inout修饰参数

1
2
3
func incrementor(inout variable: Int) ->Int{
return ++variable
}

现在是引用传递, 那么 ,我们在传递的时候,应该传递的是引用(地址)而不是参数.用法如下:

1
let newNumber =  incrementor(&number)

一般的,这样的函数,是不用返回值的.因为已经直接修改了参数

1
2
3
func incrementor(inout variable: Int){
++variable
}

函数的参数修饰是有传递限制的,就是说对于跨越层级的调用,需要保证同一参数的修饰符是统一的,比如我们基于上一个方法进行拓展,实现 +N 的方法.

1
2
3
4
5
6
func makeIncrementor(addNumber: Int) ->((inout Int)->()){
func incrementor(inout variable: Int){
variable += addNumber
}
return incrementor;
}

外层 makeIncrementor 的返回里也需要在参数的类型前面明确指出修饰词,让它和内部的定义一致,否则编译不通过.