簡體   English   中英

為什么'='賦值運算符在didSet屬性觀察器的if語句中不起作用?

[英]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
}

這是因為在初始化期間未調用didSetwillSet 因此,您的init方法需要驗證參數。

另外,可以進一步簡化radiuscircumference屬性,如下所示:

var area:Double {
    return Double.pi * pow(radius, 2)
}

只讀計算機屬性不需要get { }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM