gpt4 book ai didi

swift - didSet 中的循环

转载 作者:搜寻专家 更新时间:2023-10-30 23:12:04 25 4
gpt4 key购买 nike

我们在 didSet 中使用循环时遇到了这种奇怪的行为。我们的想法是我们有一个具有树结构的数据类型,并且在每个元素中我们想要存储该项目所在的级别。因此,在 level 属性的 didSet 中,我们还将设置子级的 level 属性。然而,我们意识到这仅在使用 forEach 时有效,而在使用 for .. in 时无效。这是一个简短的例子:

class Item {

var subItems: [Item] = []
var depthA: Int = 0 {
didSet {
for item in subItems {
item.depthA = depthA + 1
}
}
}
var depthB: Int = 0 {
didSet {
subItems.forEach({ $0.depthB = depthB + 1 })
}
}

init(depth: Int) {
self.depthA = 0

if depth > 0 {
for _ in 0 ..< 2 {
subItems.append(Item(depth: depth - 1))
}
}
}

func printDepths() {
print("\(depthA) - \(depthB)")

subItems.forEach({ $0.printDepths() })
}
}

let item = Item(depth: 3)
item.depthA = 0
item.depthB = 0
item.printDepths()

当我运行它时,我得到以下输出:

0 - 0
1 - 1
0 - 2
0 - 3
0 - 3
0 - 2
0 - 3
0 - 3
1 - 1
0 - 2
0 - 3
0 - 3
0 - 2
0 - 3
0 - 3

当从 for .. in 循环调用时,它似乎不会调用 subItems 属性的 didSet。有谁知道为什么会这样?

更新:问题不在于没有从 init 调用 didSet。我们之后更改属性(请参阅最后 4 行代码),两个深度属性中只有一个会将新值传播给 child

最佳答案

如果您使用 defer 来更新任何可选属性或进一步更新您已经初始化的非可选属性,并且在您调用任何 super 初始化方法之后,您的 willSet、didSet 等将被调用。

        for item in subItems {
defer{
item.depthA = depthA + 1
}
}

当您使用 forEach 时,它使 kindOf 与元素“契约”,并且因为它是一个不同于 for .. in 循环的实例方法,它会触发 变量的 didSet。上述情况适用于我们使用循环的地方,我们必须手动触发 didSet

这解决了我认为的问题。希望对您有所帮助!!

关于swift - didSet 中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48767328/

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