【发布时间】:2014-08-21 04:45:36
【问题描述】:
这是来自 Apple 文档的代码:
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)
}
}
如果我遵循 Doc,
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 不是willSeted:
triangleAndSquare.square.sideLength //50.0
似乎willSet 需要绑定到triangle 或square,因为square.sideLength = newValue.sideLength
如果我只设置square的属性而不创建新的Square对象,如何直接更改triangle的属性?
【问题讨论】: