クラス A は文字列値を提供します。クラス B は、内部に A 型の 2 つのメンバーを持ち、計算されたプロパティ "v" を提供して、それらのいずれかを選択します。
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
}
}
}
このコードはシンプルで機能します。A と B の両方にメンバー「値」があるため、次のようなプロトコルにします。
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
}
}
}
次のコードを変更すると
v.value = newValue
に
var v = self.v
v.value = newValue
それは再び動作します!
これは Swift のバグですか、それともプロトコルの特性に特有のものですか?