2016-05-09 16 views
3

次の例を考えてみましょう。プロパティに代入できません:関数呼び出しは不変の値を返します

struct AStruct{ 
    var i = 0 
} 

class AClass{ 
    var i = 0 
    var a: A = A(i: 8) 

    func aStruct() -> AStruct{ 
     return a 
    } 
} 

私はそれが正常にコンパイルAClassクラスのインスタンスの変数を変異させるしよう。

var ca = AClass() 
ca.a.i = 7 

しかし、私はaStructメソッドの戻り値を変異しようとすると、コンパイルが

ca.aStruct().i = 8 //Compile error. Cannot assign to property: function call returns immutable value. 

誰かがこれを説明することはできますが叫びます。

+1

「A」はどのタイプですか?あなたは 'A'として 'AStruct'をミスペルドしましたか? – BangOperator

答えて

8

これは、structの変更が役に立たないことを伝えるコンパイラの方法です。あなたがaStruct()を呼び出すときに、Aコピーがあなたに戻って渡されます。ここでは

は何が起こるかです。このコピーは、一時的なです。フィールドを調べたり、変数に代入したりすることができます(その場合は、変更に戻ることができます)。コンパイラがこの一時的な構造体を変更できるようにするならば、それらの構造体にアクセスする方法はありません。そのため、コンパイラはこれがプログラミングエラーであると確信しています。

+0

。この場合、 'struct'は無意味です。 – MadNik

4

これを試してください。

var aValue = ca.aStruct() 
aValue.i = 9 

説明

aStruct()は実際には、元の構造体aのコピーを返します。 varを割り当てない限り、暗黙的に定数として扱われます。

+0

これを今すぐ入手してください。暗黙のうちに定数として扱うことは、私が逃したポイントです。 –

関連する問題