Class A provides a string value. Class B has two members of A type inside itself, and provide a computed property "v" to choose one of them.
class A { var value: String init(value: String) { self.value = value } } class B { var v1: A? var v2: A = A(value: "2") private var v: A { return v1 ?? v2 } var value: String { get { return v.value } set { v.value = newValue } } } This code is simple and it works. Since both the A and B have a member "value", I make it a protocol like this:
protocol ValueProvider { var value: String {get set} } class A: ValueProvider { var value: String init(value: String) { self.value = value } } class B: ValueProvider { var v1: ValueProvider? var v2: ValueProvider = A(value: "2") private var v: ValueProvider { return v1 ?? v2 } var value: String { get { return v.value } set { v.value = newValue // Error: Cannot assign to the result of the expression } } } If I change the following code
v.value = newValue to
var v = self.v v.value = newValue It works again!
Is this a bug of Swift, or something special for the property of protocols?