// 给originNum参数加increment ❌
func addNumber(originNum: Int, increment: Int) {
// 这里会报错:Left side of mutating operator isn't mutable: 'originNum' is a 'let' constant
originNum += increment
}
// 使用了inout 关键字 ✅
func addNumber(originNum: inout Int, increment: Int) {
originNum += increment
}
// 方法调用 在value参数前有一个&符号
var value = 50
addNumber(originNum: &value, increment: 10)
print(value) // value = 60
inout做的事情就是把一个值传递给函数,函数可以改变这个值,然后将原来的值替换,并传递出来。
它并不是传递引用
先来弄懂两个c++中的概念。 lvalve
(变量)和 rvalve
(不是变量)
如array[2] = 4 lvalue
= rvalue
- lvalue估计来源于left value。 位置处于左边。就是
可以修改
的值。 - rvalue估计来源于right value。处于赋值语句右边,是只读的
不可修改
的值。 资料来源:关于lvalve 和 rvalve 感兴趣的同学可以看看。 inout参数,只能传递lvalve给它。因为不可能对一个rvalve进行改变。
tips:swift文档指出 我们不应该依赖inout
这个行为
注: 我们不能让这里的inout参数逃逸@escaping
(原因:inout的值会在函数返回之前赋值回去,逃逸会增加inout参数的生命周期
,如果延时返回回去赋值,原来的值不存在了,就妥妥的不安全
啊~)
@escaping 的用法后面会讲。 你急的话可以先自己百度。默认大家都很优秀,知道是什么用法!
&除了讲变量传递给inout, 还可以将变量转化为不安全的指针
。
这里的&使用就不是inout语义了,是将变量转化成了不安全的指针。