Swift 斯威夫特的观察员

Swift 斯威夫特的观察员,swift,readonly,observers,Swift,Readonly,Observers,在创建一个三角形类并使用名为isEquilateral的只读计算属性后,该属性将确定是否与此相等 class Triangle { var a: Int var b: Int var c: Int // initialization stuff var isEquilateral: Bool { return (sideA, sideB) == (sideB, sideC) } } 我如何添加一个观察者来检查长度是否发生变化,比如

在创建一个三角形类并使用名为isEquilateral的只读计算属性后,该属性将确定是否与此相等

    class Triangle {
    var a: Int
    var b: Int
    var c: Int
    // initialization stuff
    var isEquilateral: Bool {
    return (sideA, sideB) == (sideB, sideC)
    }
}
我如何添加一个观察者来检查长度是否发生变化,比如说不同类型的三角形?我是将其添加到计算属性(isEquilateral)内部还是外部?

如教程中所述:

就你而言:

var a: Int {
    willSet {
        // First time set
    }
    didSet {
        // Value changed
    }
}
var b: Int ...
var c: Int ...
这种方法对我很管用

您要找的是什么

房地产观察者观察并响应房地产价格的变化 价值每次调用属性值时,都会调用属性观察器 设置,即使新值与属性的当前值相同 价值观

假设您想观察
a
属性的变化,可以将其实现为:

class Triangle {
    var a: Int? {
        willSet {
            print("the new value is about to be: \(newValue)")
        }
        didSet {
            print("the old value was: \(oldValue)")
        }
    }

    var b: Int?
    var c: Int?

    // initialization stuff

    // ...
}
呼叫(跟踪):

如您所见,它会让您知道
a
的值已更改,并且它会告诉您新旧值是什么

因此,通过将实现作为属性观察者,您可以在更改
a
属性的值时添加自定义行为;比如说,如果
c
的值发生变化,则假定它等于
a
的新值:

var a: Int? {
        willSet {
            print("the new value is about to be: \(newValue)")
            b = newValue
        }
        didSet {
            print("the old value was: \(oldValue)")
        }
    }
或者-另一个示例-当更改
a的值时,您希望调用函数来执行某些操作:

var a: Int? {
    willSet {
        print("the new value is about to be: \(newValue)")
        doSomething()
    }
    didSet {
        print("the old value was: \(oldValue)")
    }
}

private func doSomething() {
    print("doing something...")
}
有关更多信息,我建议查看“财产观察员”部分


希望有帮助。

如果你想跟踪课外的变化,可以使用通知中心。例如:

class Triangle {
var a: Int {
    didSet {
        NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "aValueChanged"), object: self))
    }
}

func randomFunc() {
    a = 20
}
}
并捕获这些通知:

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.someFunc), name: NSNotification.Name(rawValue: "aValueChanged"), object: nil)
triangle.something()
以及接收通知的方法:

func someFunc(notification: Notification) {
    let triangle = notification.object as! Triangle
    print("a value to \(triangle.a)")
}

这将允许您检查类外的更改。输出将
值更改为20

,请包含一些与实际问题相关的代码。这段代码将如何帮助OP?他将知道下一次要做什么,这个方法对我有效好几次我同意
didSet
会有帮助的好吧,我想我现在明白了。我还有一个问题。我需要为每个变量(b和c)设置willset和didset吗?不需要。如文档中所述:“您可以选择在属性上定义一个或两个观察者:在存储值之前调用willSet。在存储新值之后立即调用didSet。”
func someFunc(notification: Notification) {
    let triangle = notification.object as! Triangle
    print("a value to \(triangle.a)")
}