swift inout参数是变量还是指针?

Ade*_*ine 5 swift inout

我觉得在以下代码中使用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
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器需要doSomeWork2(shouldContinue: &shouldContinue)而不是the compiler wants: doSomeWork2(shouldContinue: shouldContinue)?是不是shouldContinuedoSomeWork1()范围内的指针???

Dal*_*kar 8

作为指针只是inout参数的优化过程的副作用.它们实际上使用copy-in copy-out行为以不同的方式工作.所以内部函数将参数视为常规变量,而不是指针.如果将它传递给另一个带有inout参数的函数,则必须将其标记为.

输入输出参数传递如下:

调用该函数时,将复制参数的值.

在函数体中,复制了副本.

函数返回时,副本的值将分配给原始参数.

此行为称为copy-in copy-out或按值调用结果.例如,当计算属性或具有观察者的属性作为输入输出参数传递时,其getter作为函数调用的一部分被调用,其setter作为函数返回的一部分被调用.

作为优化,当参数是存储在存储器中的物理地址处的值时,在函数体内部和外部使用相同的存储器位置.优化的行为称为引用调用; 它满足了拷入式拷贝模型的所有要求,同时消除了复制的开销.使用copy-in copy-out给出的模型编写代码,而不依赖于逐个引用的优化,以便在有或没有优化的情况下它的行为正确.

进出参数