在我看到的许多didSet示例中,这段代码将返回0,但是,除了原始值之外,我无法让它返回任何其他内容。我做错了什么?
Swift
struct Circle {
var radius: Double {
didSet {
if radius < 0 {
radius = 0
}
}
}
}
var circ = Circle(radius: -25)
print(circ.radius)输出
-25发布于 2016-01-30 01:39:11
初始化时不调用didSet,只在初始化之后调用。如果要在初始化期间验证数据,则初始化程序应执行此操作。
如果你加上:
circ.radius = -50
print(circ.radius)您将看到它如您所期望的那样工作,输出将是0.0。
发布于 2018-01-14 02:59:14
如果将didSet放在defer语句中,则可以确保init中的defer。也可以在deinit中工作。
class Circle {
var radius: Double {
didSet {
if radius < 0 {
radius = 0
}
}
}
init(radius: Double) {
defer { self.radius = radius }
}
}发布于 2016-01-30 01:40:44
正如Paul在注释中所写的,在值初始化期间不调用属性观察者didSet和willSet。
如果您希望在初始化时也为值调用它们,则可以在初始化器中设置radius属性后添加函数调用,以重新设置该属性:
struct Circle {
var radius: Double {
didSet {
if radius < 0 {
radius = 0
}
}
}
init(radius: Double) {
self.radius = radius
setRadius(radius) // <-- this will invoke didSet
}
mutating func setRadius(radius: Double) {
self.radius = radius
}
}
var circ = Circle(radius: -25)
print(circ.radius) // 0.0https://stackoverflow.com/questions/35096907
复制相似问题