在下面的代码中使用 swift inout 参数我感觉有点迷失:
var shouldContinue: Bool = true
func doSomeWork1(shouldContinue: inout Bool)
{
while shouldContinue
{
// ERROR: the compiler wants: doSomeWork2(shouldContinue: &shouldContinue)
doSomeWork2(shouldContinue: shouldContinue)
}
}
func doSomeWork2(shouldContinue: inout Bool)
{
while shouldContinue
{
}
}
为什么编译器想要doSomeWork2(shouldContinue: &shouldContinue)
代替the compiler wants: doSomeWork2(shouldContinue: shouldContinue)
?不是shouldContinue
已经是 doSomeWork1() 范围内的指针???
成为指针只是 inout 参数优化过程的副作用。他们实际上以不同的方式工作复制输入 复制输出行为。因此,在函数内部,该参数被视为常规变量,而不是指针。如果将其传递给另一个接受 inout 参数的函数,则必须将其标记为这样。
输入输出参数传递如下:
当函数被调用时,参数的值被复制。
在函数体内,副本被修改。
当函数返回时,副本的值将分配给原始参数。
这
行为称为拷入拷出或按值结果调用。为了
例如,当计算属性或具有观察者的属性是
作为输入输出参数传递,其 getter 被调用作为
函数调用及其 setter 作为函数返回的一部分被调用。
作为一种优化,当参数是存储在物理上的值时
内存中的地址,内部和外部使用相同的内存位置
在函数体之外。优化的行为称为调用
参考;它满足copy-in的所有要求
复制输出模型,同时消除复制的开销。编写你的代码
使用copy-in copy-out给出的模型,而不依赖于
按引用调用优化,以便它可以正确地使用或
没有优化。
输入输出参数 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/doc/uid/TP40014097-CH34-ID545
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)