6

次のコードで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)ですか? shouldContinuedoSomeWork1() のスコープ内のポインターではありませんか ???

4

2 に答える 2

10

ポインターであることは、inout パラメーターの最適化プロセスの副作用にすぎません。それらは実際には、コピーイン コピーアウト動作を使用して異なる方法で動作します。そのため、関数内では、パラメーターはポインターではなく、通常の変数のように扱われます。inout パラメーターを取る別の関数に渡す場合は、そのようにマークする必要があります。

入出力パラメーターは次のように渡されます。

関数が呼び出されると、引数の値がコピーされます。

関数の本体で、コピーが変更されます。

関数が戻ると、コピーの値が元の引数に割り当てられます。

この動作は、コピーイン コピーアウトまたは値による呼び出しとして知られています。たとえば、計算されたプロパティまたはオブザーバーを含むプロパティが in-out パラメーターとして渡される場合、その getter は関数呼び出しの一部として呼び出され、その setter は関数 return の一部として呼び出されます。

最適化として、引数がメモリ内の物理アドレスに格納された値である場合、関数本体の内側と外側の両方で同じメモリ位置が使用されます。最適化された動作は、参照による呼び出しとして知られています。コピーのオーバーヘッドを取り除きながら、コピーイン コピーアウト モデルのすべての要件を満たします。最適化の有無にかかわらず正しく動作するように、参照による呼び出しの最適化に依存せずに、copy-in copy-out で指定されたモデルを使用してコードを記述します。

インアウト パラメータ

于 2016-11-12T21:30:25.503 に答える