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

पर्यवेक्षक के एक संपत्ति एक सुपर क्लास में घोषित करने के लिए जोड़ा जा सकता है, लेकिन एक ही कक्षा में या एक वर्ग विस्तार में नहीं। आप एक ही संपत्ति को एक समारोह में दो स्थानों पर घोषित नहीं कर सकते हैं। सबसे अच्छा समाधान जिसके साथ मैं आ सकता हूं, ऐसा कुछ है, जहां आपके पास एक वैकल्पिक बंद है जिसे आप इच्छानुसार मूल्यांकन करते हैं, और जब आप अवलोकन व्यवहार चाहते हैं तो आप केवल उस संपत्ति को कुछ असाइन करते हैं।

शायद की तरह कुछ:

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

आह, इसलिए यह जिस तरह से मैं पूछताछ कर रहा था उसमें यह मूल विशेषता नहीं है। यह समाधान उन दो मुद्दों के आसपास नहीं मिलता है जिनके बारे में मैं चिंतित था: प्रत्येक उदाहरण को 'विलसेट' और इसके परिणामस्वरूप स्थिति को चलाने की आवश्यकता होगी। मैं उम्मीद कर रहा था कि उदाहरणों के पास 'विलसेट' नहीं है, जब तक कि उन्होंने बाद में उस पर्यवेक्षक को कुछ बिंदु पर नहीं जोड़ा हो। – solidcell

+0

प्रदर्शन के साथ आपकी चिंता है? चूंकि ऊपर दिए गए उदाहरण में, यदि आप वैकल्पिक बंद नहीं हैं, तो आप केवल कोड निष्पादित करेंगे, और बंद होने की जांच कर रहे हैं! = Nil में नगण्य प्रदर्शन विधियां हैं। – cmyr

+2

यह आंशिक रूप से भाषा का पता लगाने के लिए है। हालांकि, एक उदाहरण के रूप में, मैं एक ऐसे मामले के बारे में सोच रहा हूं जहां मैं एक ऐसा एक्सटेंशन जोड़ना चाहता हूं जो कुछ तर्क को समाहित करता है और उस संपत्ति पर्यवेक्षक को उसी एक्सटेंशन में समूहीकृत किया जाना चाहिए। – solidcell

संबंधित मुद्दे