2014-10-19 59 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

相關問題