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

Swift 可以在初始声明之后添加属性观察者吗?,swift,Swift,例如,我想对类实例调用一个方法,该类实例将向属性添加一个willSet。我不希望必须在属性声明中指定willSet,因为我需要在observer中添加条件逻辑,并且它将不必要地为没有调用此方法的所有其他实例运行 大概是这样的: var someProperty: Int func someMethod() { someProperty { // this is the syntax/ability I'm unsure about willSet { ...add s

例如,我想对类实例调用一个方法,该类实例将向属性添加一个
willSet
。我不希望必须在属性声明中指定
willSet
,因为我需要在observer中添加条件逻辑,并且它将不必要地为没有调用此方法的所有其他实例运行

大概是这样的:

var someProperty: Int

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

    ...more stuff...
}

可以将观察者添加到超类中声明的属性中,但不能添加到同一类或类扩展中。不能在函数中的两个位置声明同一属性。我能想到的最好的解决方案是这样的,你有一个可选的闭包,你在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
    }
}

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

啊,所以它不是我所询问的那种本地特征。这个解决方案并没有回避我所关心的两个问题:每个实例都必须运行
willSet
,以及其中的结果条件。我希望找到一种方法,使实例根本不具有
willSet
,除非它们在稍后添加了观察器。您是否关心性能?因为在上面的示例中,只有当可选闭包不是nil时,您才会执行代码,并检查闭包是否为!=nil对性能的影响可以忽略不计。这部分是为了探索语言。但是,作为一个例子,我想添加一个封装了一些逻辑的扩展,属性观察器应该分组到同一个扩展中。好的,在扩展中不能这样做,尽管在子类中可以。我更新了一点答案。