gpt4 book ai didi

swift - 内部didSet保护离奇地延伸到全类?

转载 作者:搜寻专家 更新时间:2023-10-31 19:37:16 24 4
gpt4 key购买 nike

众所周知,当然,didSet 不会从 didSet 内部再次对同一个对象运行。 ( example .)

但是。似乎:限制不仅适用于该对象,而且可能同一类的任何对象

这里是 Playground 的复制粘贴测试用例。

class C {
var Test: Bool = false {
didSet {
print("test.")
for c in r {
c.Test = true
}
}
}
var r:[C] = []
}
var a:C = C()
var b:C = C()
var c:C = C()
a.r = [b, c]
a.Test = false

不起作用!

class C {
var Test2: Bool = false {
didSet {
print("test2.")
global.Test2 = true
}
}
}
var global:C = C()
var a:C = C()
a.Test2 = false

不起作用!

  1. 这是 Swift 的错误吗?

  2. 如果不是,实际限制是什么?它不会运行任何从 didSet 开始的 didSet(无论如何)?同一个类(class)?同一个父类(super class)?或者?

  3. doco 中具体在哪里解释了这一点?

卧槽。人们需要知道……具体的实际限制是什么?

最佳答案

这是错误 SR-419 .

来自对错误的评论:

Ugh. We really need to check that the base of the property access is statically self.

从我的实验来看,didSet 观察器似乎只有在您为任何对象设置相同的属性时才会被调用。如果您设置任何其他属性(即使在同一个对象上),观察者也会被正确调用。

class A {
var name: String
var related: A?
var property1: Int = 0 {
didSet {
print("\(name), setting property 1: \(property1)")

self.property2 = 100 * property1
related?.property1 = 10 * property1
related?.property2 = 100 * property1
}
}
var property2: Int = 0 {
didSet {
print("\(name), setting property 2: \(property2)")
}
}

init(name: String) {
self.name = name
}
}

let a = A(name: "Base")
a.related = A(name: "Related")
a.property1 = 2

输出:

Base, setting property 1: 2
Base, setting property 2: 200
Related, setting property 2: 200

当预期输出应该是:

Base, setting property 1: 2
Base, setting property 2: 200
Related, setting property 1: 20
Related, setting property 2: 2000
Related, setting property 2: 200

看来您还需要从观察者直接分配该属性。一旦你进入另一个函数(或观察者),观察者又开始工作:

var property1: Int = 0 {
didSet {
print("\(name), setting property 1: \(property1)")

onSet()
}
}

...
func onSet() {
self.property2 = 100 * property1
related?.property1 = 10 * property1
related?.property2 = 100 * property1
}

这是最好的解决方法

另一种解决方法(感谢 @Hamish)是将嵌套赋值包装到立即执行的闭包中:

var property1: Int = 0 {
didSet {
{
self.property2 = 100 * property1
related?.property1 = 10 * property1
related?.property2 = 100 * property1
}()
}
}

根据闭包前的代码,您可能必须将其括在括号中或在前面的语句后插入分号。

关于swift - 内部didSet保护离奇地延伸到全类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42144752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com