gpt4 book ai didi

swift - 设置 Swift 计算结构的一部分

转载 作者:可可西里 更新时间:2023-11-01 02:05:42 27 4
gpt4 key购买 nike

我想知道是否在任何地方记录了 swift 语言中的这种行为。我一直无法在官方文档中找到它。最好用代码来表达:

var testBacking = CGPoint(x: 3, y: 5)
var testPoint:CGPoint {
get {
print("getter called")
return testBacking
} set {
print("setter called with newValue = \(newValue)")
testBacking = newValue
}
}
testPoint.x = 10 // getter called
// setter called with newValue = (10.0, 5.0)

如你所见,我只设置了计算结构testPointx组件,这样做时,swift会自动先调用getter并取出y 组件并构建一个完整的结构,然后将其作为 newValue 传递给 setter。这似乎是适当的行为。我的问题是:这种行为记录在哪里?我错过了吗,还是根本没有提到它?

最佳答案

理解这一点的方法是考虑一个类似但更简单的案例,没有额外的复杂性。让我们谈谈这个:

struct S {
var name = "matt"
}
var s = S()
s.name = "mogelbuster"

这是如何运作的?当我们设置 s.name 时会发生什么?首先,拉出s的当前值;然后,我们设置它的 name 属性;然后,我们将 s 的值设置为这个新结构。 (您可以通过在 s 上放置一个 setter 观察器来轻松确认最后一部分。)

通过引用设置结构的属性,然后涉及获取引用的值(结构)、设置属性以及使用新结构设置引用的值。那是因为结构是一个值类型。它不能就地改变,因此通过引用结构来设置属性涉及设置引用。

您使用 testPoint 所做的只是同一过程的计算变量版本。仅提及 testPoint.x 就意味着我们必须获取 testBacking,以找出它是什么。因此, setter/getter 被调用。然后设置到 testPoint.x,从而调用 setter 将新值写回 testBacking


请注意,如果我们正在处理一个类,则同样的事情不会成立。这是原始示例的变体:

    class PointHolder {
var point = CGPoint(x:3, y:5)
var x : CGFloat {
get { return point.x }
set { point.x = newValue }
}
}
var testBacking = PointHolder()
var testPoint:PointHolder {
get {
print("getter called")
return testBacking
} set {
print("setter called with newValue = \(newValue)")
testBacking = newValue
}
}
testPoint.x = 10 // getter called, but _not_ setter

在最后一行中,testPoint setter 被调用——因为类实例是引用类型并且在适当的位置是可变的。 testBacking 无需设置即可更改,因为当我们说 testPoint.x 并调用 getter 时,我们从 testBacking 获得的是引用;对此的更改会更改 testBacking 指向而无需设置的内容。

关于swift - 设置 Swift 计算结构的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43031668/

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