的内部属性时,请考虑这样的代码只能在协议中定义的属性会导致编译错误:获取修改对象
protocol SomeProtocol {
var something: Bool { get set }
}
class SomeProtocolImplementation: SomeProtocol {
var something: Bool = false {
didSet {
print("something changed!")
}
}
}
protocol MyProtocol {
var myProperty: SomeProtocol { get }
}
class MyClass: MyProtocol {
var myProperty: SomeProtocol = SomeProtocolImplementation() {
didSet {
print("myProperty has changed")
}
}
}
var o: MyProtocol = MyClass()
o.myProperty.something = true
此代码不能用错误编译:
error: cannot assign to property: 'myProperty' is a get-only property
o.myProperty.something = true
~~~~~~~~~~~~ ^
为什么?我的属性是SomeProtocolImplementation类型,它是类类型,所以应该可以使用对myProperty的引用来修改它的内部属性。
的进一步深入,修改myProperty的定义,使它看起来像后:
var myProperty: SomeProtocol { get set }
奇怪的事情发生了。现在代码编译(并不意外),但输出是:
something changed!
myProperty has changed
所以在这一点SomeProtocolImplementation开始表现得像一个值类型 - modyifing它的内部状态导致了“didSet”回调myProperty的被触发。正如SomeProtocolImplementation将结构...
我实际上找到解决方案,但我也想知道发生了什么事。解决方案是修改SomeProtocol定义为:
protocol SomeProtocol: class {
var something: Bool { get set }
}
它工作正常,但我想明白为什么它的行为是这样的。任何人都可以解释?