Swift 斯威夫特的观察员
在创建一个三角形类并使用名为isEquilateral的只读计算属性后,该属性将确定是否与此相等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) } } 我如何添加一个观察者来检查长度是否发生变化,比如
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)")
}