2015-11-17 24 views
9

के माध्यम से गुणों को initit नहीं कर सकता है मैं उत्सुक हूं कि आपके init विधि के अंदर एक विधि को कॉल करने के लिए वैसे भी है जो कक्षा के इंस्टेंस गुण सेट करता है । अनिवार्य रूप से मेरे पास सिर्फ एक वर्ग है जो उप-वर्ग UIView, init में कुछ सबव्यूव जोड़ता है, और उनमें से कुछ सबव्यूज़ कक्षा के उदाहरण चर हैं।'super.init से पहले विधि कॉल में स्वयं का उपयोग स्वयं शुरू होता है', एक विधि कॉल

class MyView: UIView { 
    var collectionView: UICollectionView 

    convenience init() { 
     self.init(frame:CGRectZero) 
    } 

    override init (frame : CGRect) { 
     super.init(frame : frame) 

     addSubviews() 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     addSubviews() 
    } 

    func addSubviews(){ 
     self.collectionView = UICollectionView() 

    } 
} 

अब समस्या आता है कि मैं अपने कक्षाएं आरंभ करने से पहले सुपर init फोन नहीं कर सकते हैं आंतरिक गुण (संपत्ति 'self.collectionView' super.init कॉल पर inialized नहीं), लेकिन मैं यह भी अपने कस्टम कॉल नहीं कर सकते super.init से पहले उन चर को प्रारंभ करने के लिए विधि, क्योंकि यह उस प्रारंभिक से पहले स्वयं का उपयोग नहीं कर सकता है। मुझे एहसास है कि मैं इंस्टेंस वैरिएबल वैकल्पिक बना सकता हूं, लेकिन यह कम सुरुचिपूर्ण लगता है, क्योंकि मुझे पता है कि यह हमेशा शुरू किया जाएगा (और कई और हैं, यह सिर्फ एक सरलीकृत संस्करण है)। क्या मेरे सभी इंस्टेंस वैरिएबल विकल्प बनाने के बिना इसे पूरा करने का कोई तरीका है?

संपादित करें:

मुझे लगता है कि अंत में मेरे सवाल है क्यों तेज पूर्व super.init बुला के लिए एक विधि बुला असंतुष्ट अनुमति देता है?

override init (frame : CGRect) { 
    addSubviews() 
    super.init(frame : frame) 
} 

final func addSubviews(){ 
    self.collectionView = UICollectionView() 
} 

और

override init (frame : CGRect) { 
    self.collectionView = UICollectionView() 
    super.init(frame : frame) 
} 
+0

में प्रारंभ नहीं किया गया है, क्योंकि आप जानते हैं कि वे हमेशा प्रारंभ किए जाएंगे, आप गुणों को पूरी तरह से अनचाहे विकल्प बना सकते हैं। – Moritz

+0

@EricD। इस तरह यह वर्तमान में कर रहा था, लेकिन मुझे यह सुनिश्चित करने के लिए संकलन समय की जांच पसंद है कि हम वास्तव में उन्हें सभी –

+0

गुणों को डिफ़ॉल्ट मान देते हैं – user3441734

उत्तर

18

फार्म प्रलेखन:

Swift’s compiler performs four helpful safety-checks to make sure that two-phase initialization is completed without error:

Safety check 1 A designated initializer must ensure that all of the properties introduced by its class are initialized before it delegates up to a superclass initializer.

आप उदाहरण चर के लिए मान सेट करने से पहले आप super.init फोन की जरूरत है() और इस कार्रवाई के बाद बीच क्या अंतर है आप कॉल इंस्टेंस विधियों तक पहुंच पाएंगे। प्रश्न के संपादन के लिए

override init (frame : CGRect) { 
    self.collectionView = UICollectionView() 
    super.init(frame : frame) 
    // Now you can call method 
    self.someMethod() 
} 

जोड़ें: आपके मामले में आप यह कर सकते हैं

आप super.init() क्योंकि सुरक्षा कारणों से कॉल करने से पहले विधि कॉल नहीं कर सकते। यदि आप ऐसा करेंगे तो आपकी विधि कुछ गुणों का उपयोग कर सकती है जिन्हें अभी तक मूल वर्ग

+1

हाँ, मेरे पास एकमात्र समस्या है, क्या कोड को कोडर इनिट के बीच डुप्लिकेट करना होगा और फ्रेम init। इसे एक अलग विधि में खींचना आदर्श है, लेकिन तेज़ आपको इनिट से पहले एक विधि को कॉल करने नहीं देगा। –

+0

@ केविन डीआईट्रैग्लिया सबसे पहले आप इस विधि को दो बार कॉल करने के साथ प्रारंभिकता को डुप्लिकेट करने का प्रयास कर चुके हैं। और दूसरा दो प्रारंभिक प्रारंभिक नियमों के कारण तेज़ी से नहीं कर सकता है: सभी गुणों को 'super.init()' कॉल के लिए पेश किया जाना चाहिए और उदाहरण विधियों को केवल 'super.init()' कॉल –

+0

@ केविन डीआईट्रैग्लिया I के बाद बुलाया जा सकता है। उत्तर –

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