2014-10-19 14 views
6

Örneğin, bir özellik için bir willSet ekleyecek bir sınıf örneğinde bir yöntem aramak istiyorum. Gözlemci içinde şartlı mantık eklemem gerekeceğinden, bildirimin içinde willSet belirtmek zorunda kalmak istemiyorum ve bu yönteme sahip olmayan diğer her örnek için gereksiz yere koşulacaktı. Böyleİlk bildirimin ardından bir özellik gözlemcisi eklenebilir mi?

şey:

var someProperty: Int 

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

    ...more stuff... 
} 

cevap

3

Gözlemci fakat aynı sınıfta veya bir sınıf uzantısında, bir üst sınıfta bildirilen bir özellik eklenebilir. Aynı özelliği iki yerde bir işlev olarak ilan edemezsiniz. Buraya gelebileceğim en iyi çözüm, willSet'te değerlendirdiğiniz isteğe bağlı bir kapatma özelliğiniz olan böyle bir şeydir ve yalnızca gözlemleme davranışını istediğinizde bu özelliğe bir şey atayabilirsiniz.

belki gibi bir şey:

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

Özellikle zarif değil, ama daha çok ya da daha az arzu davranışı idare olabilir?

+1

Ah, bu yüzden araştırdığım şekilde yerel bir özellik değil. Bu çözüm, endişelendiğim iki konuyu ele almıyor: Her örnek, "willSet" i ve bunun sonucunda ortaya çıkan koşulu çalıştırmak zorunda kalacak. Gözlemciyi daha sonraki bir noktaya eklemedikleri sürece, örneklerin 'willSet'i' olmayan bir şekilde olmasını umuyordum. – solidcell

+0

Endişeniz performansla mı ilgili? Çünkü yukarıdaki örnekte, sadece opsiyonel kapanma sıfır değilse ve kodun kontrol edilemediğini kontrol eden bir kodunuz olacaktır: = sıfır, göz ardı edilebilir performans oranlarına sahiptir. – cmyr

+2

Bu kısmen dili keşfetmek için. Bununla birlikte, bir örnek olarak, bazı mantığı kapsülleyen bir uzantı eklemek istediğim bir durum hakkında düşünmekteyim ve bu özellik gözlemcisinin aynı uzantıda gruplanması gerekir. – solidcell

İlgili konular