[英]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
需要綁定到triangle
或square
,因為square.sideLength = newValue.sideLength
僅在設置square
的屬性而不創建新的Square
對象時,如何直接更改triangle
的屬性?
它無法正常工作,因為willSet
&co。 作用於實際屬性(在本例中為triangle
和square
)的變化。 由於它們是類,因此修改其屬性不會更改表示它們的類指針,而只會更改其內容所指向的位置(即,它是相同的三角形和正方形,而不是新實例)。
要執行您想要的操作,您將必須對Square
和Triangle
類進行子類化,以在您要觀察的屬性的這些子類中提供willSet
。 為了使其按預期工作,每個子類都必須具有一個新屬性(例如brother: NameShape
),您必須在復合類的init
進行設置,以便它們可以更改彼此的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.