初始声明后可以添加属性观察者吗?

sol*_*ell 6 swift

例如,我想在类实例上调用一个方法来添加willSet属性.我不想willSet在属性的声明中指定,因为我需要在观察者中添加条件逻辑,并且对于没有调用此方法的每个其他实例,它将被不必要地运行.

像这样的东西:

var someProperty: Int

func someMethod() {
    someProperty {  // this is the syntax/ability I'm unsure about
        willSet { ...add some behavior... }
    }

    ...more stuff...
}
Run Code Online (Sandbox Code Playgroud)

cmy*_*myr 3

观察者可以添加到超类中声明的属性,但不能添加到同一类或类扩展中。您不能在函数中的两个位置声明相同的属性。我能想到的最好的解决方案是这样的,你有一个可选的闭包,你可以在 willSet 中评估它,并且只有当你想要观察行为时,你才为该属性分配一些东西。

也许是这样的:

private var _willSetCallback: ((Int) -> (Bool))?
var someProperty: Int {
    willSet {
        if let optionalBool = _willSetCallback?(newValue) {
             // do something
        }
    }
}

func someMethod() {
    self._willSetCallback = { newValue in
    return newValue > 0
    }
}
Run Code Online (Sandbox Code Playgroud)

它不是特别优雅,但它可能或多或少可以处理您想要的行为?

  • 部分原因是为了探索语言。然而,作为一个例子,我正在考虑一种情况,我想添加一个封装一些逻辑的扩展,并且属性观察器应该分组在同一个扩展中。 (2认同)