Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot assign to property: function call returns immutable value

Tags:

swift

Consider the following example.

struct AStruct{
    var i = 0
}

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

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

If I try to mutate the the variable of a instance of class AClass it compiles successfully.

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

But If I try to mutate the return value of aStruct method, the compile screams

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

Can someone explain this.

like image 406
Swift Hipster Avatar asked May 09 '16 10:05

Swift Hipster


2 Answers

Try this.

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

Explanation

aStruct() actually returns a copy of the original struct a. it will implicitly be treated as a constant unless you assign it a var.

like image 59
MadNik Avatar answered Sep 20 '22 15:09

MadNik


This is compiler's way of telling you that the modification of the struct is useless.

Here is what happens: when you call aStruct(), a copy of A is passed back to you. This copy is temporary. You can examine its fields, or assign it to a variable (in which case you would be able to access your modifications back). If the compiler would let you make modifications to this temporary structure, you would have no way of accessing them back. That is why the compiler is certain that this is a programming error.

like image 26
Sergey Kalinichenko Avatar answered Sep 18 '22 15:09

Sergey Kalinichenko