如果我将属性值设置为与当前设置为相同的值,willSet和didSet会被调用吗?这对了解何时在这些功能中出现副作用很重要。为属性设置相同的值是否仍然调用willSet和didSet?
7
A
回答
12
是的,即使设置为相同的值,willSet和didSet也会被调用。我在操场上进行了测试:
class Class1 {
var willSetCount = 0
var didSetCount = 0
var var1: String = "A" {
willSet {
willSetCount++
}
didSet {
didSetCount++
}
}
}
let aClass1 = Class1() // {0 0 "A"}
aClass1.var1 = "A" // {1 1 "A"}
aClass1.var1 = "A" // {2 2 "A"}
如果你想阻止时被设置相同的值发生副作用,你可以将该值比较NEWVALUE /属性oldValue:
class Class2 {
var willSetCount = 0
var didSetCount = 0
var var1: String = "A" {
willSet {
if newValue != var1 {
willSetCount++
}
}
didSet {
if oldValue != var1 {
didSetCount++
}
}
}
}
let aClass2 = Class2() // {0 0 "A"}
aClass2.var1 = "A" // {0 0 "A"}
aClass2.var1 = "B" // {1 1 "B"}
7
是,它确实如此。你可能有一个不符合Equatable协议的类型的属性,那么“相同的值”就没有意义。 willSet
和didSet
仅在初始化程序内设置值时才被调用。
相关问题
- 1. “属性oldValue”和“NEWVALUE”默认参数内willSet/didSet名未确认
- 2. 为什么'didset'在设置属性属性时会调用属性?
- 3. * Win32 API调用是否仍然相关?
- 4. 在Swift中,是否重置didSet中的属性触发另一个didSet?
- 5. Kotlin中是否存在didSet/willSet类似物?
- 6. SSI是否仍然相关?
- 7. eAccelerator是否仍然相关?
- 8. 如果属性值相同,则将值设置为未修改
- 9. 将相同的值设置为多个属性(CSS)
- 10. 设置属性的属性是否调用第一个属性的setter?
- 11. 如何在不更改属性值的情况下调用didSet
- 12. C#/ ASP.NET MVC:我设置了属性的值,但它仍然为空
- 13. 在RenderTransfrom属性上应用ScaleTransfrom后,新尺寸仍然相同
- 14. 设置方法调用期望值,同时仍然调用原始实现
- 15. 调试属性如[DebuggerDisplay]是否仍然编译为发布二进制文件?
- 16. 当调用-awakeFromFetch时,托管属性是否已设置为默认值?
- 17. 为-webkit-transform重新设置相同的值是否昂贵?
- 18. Ninject注入的属性仍然为空
- 19. src属性忽略了嵌入式链接,如果它仍然是相同的
- 20. HTTP 1.0指令是否仍然相关?
- 21. JAXB解组:设置相同属性值的两个模型类的属性
- 22. 相同的起源和位置属性
- 23. 由字段访问的属性是否仍然延迟加载?
- 24. 这是否仍然是otsu二值化?
- 25. 尽管设置了maxWidth属性,AnchorPane仍然在增长
- 26. session_handler未设置会话数据字段仍然相同
- 27. 设置属性值使用属性名
- 28. 是否仅为计算属性获取{}和设置{}?
- 29. mappedBy和inverse属性是相同的?
- 30. processAjaxOnInit:设置为“false”,但仍然调用Ajax
如果你尝试它会发生什么? – 2014-08-28 16:36:39
@MikePollard当我问这个问题时,我发布了我的答案。 – 2014-08-28 19:11:46