参数默认是 let 类型的
一般省略函数参数的修饰符 ,我们并没有指定它是什么类型
1 | func incrementor(variable: Int) ->Int{ |
默认是 let ,比如下面的是错误代码 , 因为 let 不可变
1 | func incrementor(variable: Int) ->Int{ |
仔细看错误提示:Mark parameter with 'var' to make it mutable
需要显式写 var
1 | func incrementor(var variable: Int) ->Int{ |
inout
函数参数是值传递,就是说,不会改变外部参数的值,比如:
1 | var number = 7 |
newNumber是 8 , number 还是 7 .
如果想要修改,那么就应该加上 inout修饰参数
1 | func incrementor(inout variable: Int) ->Int{ |
现在是引用传递, 那么 ,我们在传递的时候,应该传递的是引用(地址)而不是参数.用法如下:
1 | let newNumber = incrementor(&number) |
一般的,这样的函数,是不用返回值的.因为已经直接修改了参数1
2
3func incrementor(inout variable: Int){
++variable
}
函数的参数修饰是有传递限制的,就是说对于跨越层级的调用,需要保证同一参数的修饰符是统一的,比如我们基于上一个方法进行拓展,实现 +N 的方法.
1 | func makeIncrementor(addNumber: Int) ->((inout Int)->()){ |
外层 makeIncrementor 的返回里也需要在参数的类型前面明确指出修饰词,让它和内部的定义一致,否则编译不通过.