[英]Why does the '=' assignment operator not work in my if statement in my didSet property observer?
struct Circle {
// Properties
var radius: Double {
didSet {
if oldValue < 0 {
radius = 0
}
}
}
var area:Double {
get{
return Double.pi * pow(radius, 2)
}
}
var circumference: Double {
get {
return 2 * radius * Double.pi
}
}
init() {
radius = 0
}
init(radius r: Double) {
radius = r
}
}
// test circle
var testCircle = Circle()
print ("radius:", testCircle.radius, "area: ", testCircle.area, "circumference: ", testCircle.circumference)
var testCircle2 = Circle(radius: 2.5)
print("radius: ", testCircle2.radius, " area: ", testCircle2.area, "circumference: ", testCircle2.circumference)
var testCircle3 = Circle(radius: 20)
print("radius: ", testCircle3.radius, "area: ", testCircle3.area, "circumference: ", testCircle3.circumference)
var testCircle4 = Circle(radius: -4.5)
print("radius: ", testCircle4.radius, "area: ", testCircle4.area, "circumference: ", testCircle4.circumference)
在init
期間不會調用didSet
屬性觀察器。 您可以將分配包裝在defer { ... }
語句中,以強制didSet
。
例如:
init(radius r: Double) {
defer { radius = r }
}
如果您希望默認半徑為0
,則建議為radius
使用默認參數值,如下所示:
init(radius r: Double = 0) {
defer { radius = r }
}
...這樣一來,您可以避免使用兩個init方法,並且仍將一個Circle
初始化為Circle()
( radius = 0
)和一個Circle(radius: 3)
( radius = 3
)。
請記住,在實際更改屬性后會調用didSet
。 oldValue
將包含先前的值。
您要檢查新值是否為負。
將代碼更新為:
var radius: Double {
didSet {
if radius < 0 {
radius = 0
}
}
}
您要檢查radius
(最新值)是否為負。
您還需要更新您的init
方法:
init(radius r: Double) {
radius = r >= 0 ? r : 0
}
這是因為在初始化期間未調用didSet
和willSet
。 因此,您的init
方法需要驗證參數。
另外,可以進一步簡化radius
和circumference
屬性,如下所示:
var area:Double {
return Double.pi * pow(radius, 2)
}
只讀計算機屬性不需要get { }
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.