【发布时间】:2018-02-17 14:19:37
【问题描述】:
请考虑这个 Swift 代码。我有一个类,它包装了另一个类的实例。当我在所持有的值上设置一个属性时,包装类的属性观察器就会运行。
protocol MyProtocol {
var msgStr: String? { get set }
}
class MyClass: MyProtocol {
var msgStr: String? {
didSet {
print("In MyClass didSet")
}
}
}
class MyWrapperClass {
var myValue: MyProtocol! {
didSet {
print("In MyWrapperClass didSet")
}
}
}
let wrapperObj = MyWrapperClass()
wrapperObj.myValue = MyClass() // Line1
wrapperObj.myValue.msgStr = "Some other string" // Line2
上面代码的输出是:
在 MyWrapperClass 中 didSet
在 MyClass didSet
在 MyWrapperClass 中做了设置
我知道didSet是在变量值改变时调用的。
因此,当执行“Line1”处的上述代码时,我知道打印了“In MyWrapperClass didSet”,这很好。
接下来当 Line2 执行时,我希望正确地打印“In MyClass didSet”,但我不确定为什么会打印“In MyWrapperClass didSet”,因为属性myValue 没有改变。谁能解释一下原因?
【问题讨论】:
-
您能否向我们展示您对这些属性进行实际分配的代码?
-
@ItaiFerber 最后三行代码sn-p。
-
与您的问题完全无关,但不要使用隐式展开的可选属性来替代为您的类编写初始化程序(在这种情况下,属性可以是非可选的)。跨度>
标签: swift properties didset property-observer