2014-10-04 10 views
20

मुझे पता है कि यह उत्तर पहले से ही किसी अन्य रूप में पोस्ट किया गया है, लेकिन मैं तेजी से इंस्टेंस चर को ओवरराइड करने के बारे में अधिक समझना चाहता हूं।स्विफ्ट ओवरराइड उदाहरण चर

चलो कहते हैं कि मैं इस कोड

class BaseView:UIView{ 
let someVariable:Int = 1 
// do some work with someVariable 
} 

class ExtendedView:BaseView{ 
let someVariable:Int = 2 
} 

ठीक करते हैं। जो मैंने पढ़ा है, उसके लिए निरंतर ओवरराइड उपसर्ग की आवश्यकता होती है। अन्य उत्तरों ने कहा कि मुझे सेटर और गेटर घोषित करना चाहिए? क्यूं कर? मुझे वास्तव में उन दोनों की परवाह नहीं है। मुझे सिर्फ मूल्य की जगह चाहिए। मैं वास्तव में init ओवरराइड का उपयोग नहीं कर सकता क्योंकि मैं UIView से विरासत में हूं और यह काफी खतरनाक हो सकता है (मुझे लगता है)।

किसी भी सुझाव का स्वागत है।

+0

लिखित रूप में वे अलग-अलग और असंबंधित वर्ग चर जैसे दिखते हैं, बस एक ही नाम के साथ। –

उत्तर

43

जैसा कि आप कहते हैं, आप बस सबक्लास में स्थिरता को फिर से परिभाषित नहीं कर सकते (यह एक स्थिर है, सब के बाद)। आपको मिली त्रुटि "संग्रहीत संपत्ति के साथ ओवरराइड नहीं कर सकती" है। ऐसा लगता है कि var को ओवरराइड करना संभव प्रतीत होता है, हालांकि, जब मैं let someVariable को var someVariable में बदलता हूं तो मुझे उप-वर्ग में पहुंचने पर "कुछ उपलब्ध 'का अस्पष्ट उपयोग मिलता है (नोट - वही बात होती है कि मैं override का उपयोग करता हूं या नहीं) ।

सबसे आसान समाधान एक गेटर का उपयोग करना है। यह वास्तव में एक समारोह है, तो आप खुशी से यह ओवरराइड कर सकते हैं, समर्थन चर आप के लिए प्रबंधित किया जाएगा, और यदि आप एक सेटर की आपूर्ति नहीं है ... यह हर वर्ग के लिए निरंतर हो जाएगा:

class BaseView: UIView { 
    var someVariable: Int { get { return 1 } } 
    // do some work with someVariable 
} 

class ExtendedView: BaseView { 
    override var someVariable: Int { get { return 2 } } 
} 

let a = BaseView() 
a.someVariable // 1 
let b = ExtendedView() 
b.someVariable // 2 

के रूप में कमेंटेटर @ user3633673 बताते हैं, यदि आप केवल में गेटर (और एक सेटटर नहीं है) है, तो आप get छोड़ सकते हैं, लेकिन मैंने इसे सिद्धांत की स्पष्टता के लिए छोड़ दिया। यहां इसके बिना ही है ...

class BaseView: UIView { 
    var someVariable: Int { return 1 } 
    // do some work with someVariable 
} 

class ExtendedView: BaseView { 
    override var someVariable: Int { return 2 } 
} 

let a = BaseView() 
a.someVariable // 1 
let b = ExtendedView() 
b.someVariable // 2 
+8

कुछ पाठकों के लिए यह ध्यान दिया जाना चाहिए कि सरल पढ़ने-योग्य गणना वाले गुणों में "प्राप्त" आवश्यक नहीं है। 'var कुछ उपलब्ध: Int {return 1}' 'var कुछ के लिए लघुरूप है: int {get {return 1}}'। – user3633673

+0

धन्यवाद, बहुत अच्छी तरह से समझाया गया! –

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