【问题标题】:Swift: how to willSet object's attribute directly?Swift:如何直接设置对象的属性?
【发布时间】: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 需要绑定到trianglesquare,因为square.sideLength = newValue.sideLength

如果我只设置square的属性而不创建新的Square对象,如何直接更改triangle的属性?

【问题讨论】:

    标签: ios macos swift


    【解决方案1】:

    因为willSet & co,它没有像你预期的那样工作。根据实际属性(在本例中为 trianglesquare)变化。由于它们是类,因此修改它们的属性不会更改代表它们的类指针,只会更改其内容指向的内容(即它是相同的三角形和正方形,而不是新实例)。

    要做你想做的事,你必须对类 SquareTriangle 进行子类化,以便在你想要观察的属性的这些子类中提供 willSet。为了使其按预期工作,这些子类中的每一个都必须有一个新属性(例如 brother: NameShape ),您必须在复合类的 init 中设置它,以便它们可以更改彼此的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      相关资源
      最近更新 更多