2014-10-19 25 views
6

例如,我想调用一个类实例的方法,该方法会将willSet添加到属性中。我不想在属性声明中指定willSet,因为我需要在观察者中添加条件逻辑,并且对于没有调用此方法的其他每个实例都会不必要地运行。在初始声明之后可以添加属性观察者吗?

事情是这样的:

var someProperty: Int 

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

    ...more stuff... 
} 

回答

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 
    } 
} 

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

+1

啊,所以这不是我询问的方式的本地功能。这个解决方案没有解决我所关心的两个问题:每个实例都必须运行'willSet'及其中的结果条件。我希望有一种方法让实例根本没有'willSet',除非他们稍后添加了这个观察者。 – solidcell 2014-10-20 00:15:11

+0

您对性能的关注吗?因为在上面的例子中,如果可选闭包不为零,并且检查闭包!= nil具有可忽略的性能分支,则只会执行代码。 – cmyr 2014-10-22 15:08:43

+2

这部分是探索语言。然而,作为一个例子,我正在考虑一个情况,我想添加一个扩展来封装一些逻辑,并且属性观察者应该被分组在同一个扩展中。 – solidcell 2014-10-23 20:07:14

相关问题