簡體   English   中英

斯威夫特:如何直接設置對象的屬性?

[英]Swift: how to willSet object's attribute directly?

這是Apple Doc的代碼:

class NameShape{
    var numberOfSide: Int = 0
    var name:String
    func simpleDescription() -> String {
        return "A square with \(numberOfSide) sides."
    }
    init (name: String){
        self.name = name
        }
}

class Square:NameShape{
    var sideLength: Double
    init(name: String, sideLength: Double){
        self.sideLength = sideLength
        super.init(name: name)


        numberOfSide = 4
    }

    func area() ->Double {
        return sideLength * sideLength
    }

    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)."
    }

}

class EquilateralTriangle:NameShape{
    var sideLength: Double = 0.0

    init(sideLength: Double, name: String){
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSide = 3
    }

    var perimeter: Double{
    get{
        return 3.0 * sideLength
    }
    set{
        sideLength = newValue / 3.0
    }
    }

    override func simpleDescription() -> String {
        return "An equilateral triangle with sides of length \(sideLength)."
    }
}

class TriangleAndSquare{
    var triangle:EquilateralTriangle{
    willSet {
    square.sideLength = newValue.sideLength
    }
    }
    var square: Square{
    willSet {
        triangle.sideLength = newValue.sideLength
    }
    }
    init(size: Double, name: String){
        square = Square(name: name, sideLength: size)
        triangle = EquilateralTriangle(sideLength: size, name: name)
    }
}

如果我遵循文檔,

var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
triangleAndSquare.square.sideLength //10.0
triangleAndSquare.triangle.sideLength //10.0
triangleAndSquare.square = Square(name: "larger square", sideLength: 50)
triangleAndSquare.triangle.sideLength //500.0

但是如果我只是更改triangle.sideLength

triangleAndSquare.triangle.sideLength = 25
triangleAndSquare.triangle.sideLength //25.0

但是square.sideLength不是willSet ed:

triangleAndSquare.square.sideLength //50.0 

似乎willSet需要綁定到trianglesquare ,因為square.sideLength = newValue.sideLength

僅在設置square的屬性而不創建新的Square對象時,如何直接更改triangle的屬性?

它無法正常工作,因為willSet &co。 作用於實際屬性(在本例中為trianglesquare )的變化。 由於它們是類,因此修改其屬性不會更改表示它們的類指針,而只會更改其內容所指向的位置(即,它是相同的三角形和正方形,而不是新實例)。

要執行您想要的操作,您將必須對SquareTriangle類進行子類化,以在您要觀察的屬性的這些子類中提供willSet 為了使其按預期工作,每個子類都必須具有一個新屬性(例如brother: NameShape ),您必須在復合類的init進行設置,以便它們可以更改彼此的屬性。

暫無
暫無

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

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