2017-10-25 9 views
6

मुझे कभी-कभी ऐसा दृश्य दिखाई देता है जहां दो अलग-अलग init विधियों में एक ही सेटअप() फ़ंक्शन होता है। इनिट विधियों के बीच क्या अंतर है और दोनों में एक ही सेटअप() क्यों कहा जा रहा है ..?अंतर? - स्विफ्ट

class BigButton: UIButton { 

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

    required init?(coder: NSCoder) { 
     super.init(coder: coder) 
     setup() 
    } 

    fileprivate func setup() { 
     // set up stuff 
    } 
} 
+1

[स्विफ्ट भाषा डॉक्स] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18 पढ़ने के बारे में कैसे करें -XID_335) प्रारंभिकरण के बारे में? – holex

+0

@ होलेक्स सुपर आलसी के बारे में कैसे – BlueBoy

उत्तर

3

override init(frame: CGRect) का उपयोग तब किया जाता है जब आप दृश्य (इस मामले में बटन) प्रोग्रामेटिक रूप से बनाते हैं।

required init?(coder: NSCoder) का उपयोग स्टोरीबोर्ड/xib से दृश्य बनने पर किया जाता है।

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

सेटअप दोनों में कॉल किया जाता है क्योंकि आप उस बटन को बनाना चुनते हैं जिसे आप अपना कस्टम व्यवहार सेट करना चाहते हैं, तो यह काम करेगा आप

2

आप बिल्डर कहीं और प्रोग्राम के रूप में कुछ कहीं और दोनों इंटरफ़ेस में ऐसे वर्ग का उपयोग कर रहे हैं, और सेटअप सामान कोई फर्क नहीं पड़ता कि कैसे आप क्लास का उपयोग किया जाना था, तो यह आसान है इस तरह init() लिखने के लिए।

init(NSCoder:) स्वचालित रूप से कॉल किया जाता है जब आप बटन को .nib या storyboard में डालते हैं, तो कंपाइलर वास्तव में दृश्य का फ्रेम जानता है ताकि init(CGRect:) आवश्यक न हो। इसके विपरीत, आप आमतौर पर कोड के साथ विचार बनाते समय init(CGRect:) का उपयोग करते हैं, आप यह सुनिश्चित करना चाहते हैं कि setup() दोनों प्रारंभिक प्रक्रियाओं के दौरान निष्पादित किया गया है, इस प्रकार आप प्रारंभिक कार्यों में setup() डालते हैं।

1

के लिए यह इरादा जब आप override एक प्रारंभकर्ता जैसे init(frame: CGRect), आप इसे एक नामित प्रारंभकर्ता के खिलाफ करते हैं, प्रिंसिपल प्रारंभकर्ता एक वस्तु प्रोग्राम के रूप में बनाने के लिए जिम्मेदार यानी। नियमों के अनुसार, आपको super.initपर से पहले किसी अतिरिक्त इनिट क्रियाओं को निष्पादित करना होगा।

दूसरी तरफ आवश्यक प्रारंभिक, नामित के समान नहीं हैं।

आवश्यक initializers

आवश्यक संशोधक लिखें से पहले एक वर्ग प्रारंभकर्ता की परिभाषा संकेत मिलता है कि वर्ग के हर उपवर्ग कि प्रारंभकर्ता को लागू करना चाहिए।

आपको प्रत्येक उपclass आवश्यक प्रारंभिक के कार्यान्वयन से पहले आवश्यक संशोधक लिखना होगा, यह इंगित करने के लिए कि प्रारंभकर्ता आवश्यकता श्रृंखला में और उप-वर्गों पर लागू होती है। आप आवश्यक नामित प्रारंभकर्ता को ओवरराइड करते समय ओवरराइड संशोधक नहीं लिखते हैं।

स्रोत: Apple Documentation On Initializers

आपको आवश्यक प्रारंभकर्ता अपनी इच्छा की परवाह किए बिना लागू करता है, तो मूल वर्ग कि प्रारंभकर्ता के रूप में आवश्यक के रूप में चिह्नित किया गया है, जब आप एक उपवर्ग हैं। आम तौर पर, आपको इसे ऑब्जेक्ट बनाने के लिए सीधे कॉल नहीं करना चाहिए, हालांकि कुछ मामलों में आप करते हैं। आवश्यक प्रारंभिकरणों को कई, अच्छी तरह से, आवश्यकताओं का अनुपालन करने के लिए चिह्नित किया गया है। उदाहरण के लिए, required init?(coder: NSCoder) कई मामलों में बुलाया जाता है। एक मामला: जब आईबी से दृश्य बनाया जाता है। एक और मामला - जब कोई ऑब्जेक्ट बनाया जाता है, या इसके बजाय, अनारक्षित (जिसे deserialization कहा जाता है) मैन्युअल रूप से। वास्तव में, जब आप उस ऑब्जेक्ट को व्यू कंट्रोलर के दृश्य (उदाहरण के लिए) पर रखते हैं, तो वह ऑब्जेक्ट भी अनारक्षित है, यानी इसकी सभी गुणों को लोड और सेट किया जाता है।

जाहिर है, जब आप कुछ दृश्यों का उप-वर्ग बनाते हैं, तो आपको इसे इस इंटरफ़ेस का समर्थन करना होगा, जो deserialization क्षमता प्रदान करता है (यदि इसे कभी-कभी इंटरफ़ेस बिल्डर या किसी भी प्रकार से उपयोग किया जाता है)। यही कारण है कि यह required है।

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