मुझे दोनों के बीच अंतर या सुविधा init के उद्देश्य को समझने में परेशानी हो रही है। धन्यवादस्विफ्ट में सुविधा init बनाम init के बीच क्या अंतर है, स्पष्ट उदाहरण बेहतर
उत्तर
स्टैंडर्ड init
:
मनोनीत initializers एक वर्ग के लिए प्राथमिक initializers हैं। नामित प्रारंभकर्ता पूरी तरह से द्वारा पेश की जाने वाली सभी गुणों को प्रारंभ करता है और सुपरक्लास श्रृंखला को प्रारंभिक प्रक्रिया जारी रखने के लिए उपयुक्त सुपरक्लास प्रारंभकर्ता को कॉल करता है।
convenience init
:
सुविधा initializers एक वर्ग के लिए initializers समर्थन माध्यमिक हैं। डिफ़ॉल्ट नामों पर निर्धारित नामित प्रारंभकर्ता के मानकों के कुछ के साथ सुविधा प्रारंभकर्ता के रूप में एक ही श्रेणी से नामित प्रारंभकर्ता को कॉल करने के लिए आप एक सुविधा प्रारंभकर्ता को परिभाषित कर सकते हैं। आप किसी विशिष्ट उपयोग केस या इनपुट मान प्रकार के लिए उस श्रेणी का उदाहरण बनाने के लिए सुविधा प्रारंभकर्ता को भी परिभाषित कर सकते हैं।
के अनुसार मूल रूप से यह सब संक्षेप में इसका मतलब है कि आप एक सुविधा प्रारंभकर्ता का उपयोग तेजी से और अधिक "सुविधाजनक" एक निर्दिष्ट प्रारंभकर्ता बुला बनाना है। तो सुविधाजनक प्रारंभकर्ताओं को self.init
के उपयोग की आवश्यकता होती है जैसे super.init
जो कि आप किसी निर्दिष्ट प्रारंभकर्ता के ओवरराइड में देखते हैं।
स्यूडोकोड उदाहरण:
init(param1, param2, param3, ... , paramN) {
// code
}
// can call this initializer and only enter one parameter,
// set the rest as defaults
convenience init(myParamN) {
self.init(defaultParam1, defaultParam2, defaultParam3, ... , myParamN)
}
मैं इन एक बहुत का उपयोग करें जब लंबे initializers मुख्य रूप से deafults है साथ कस्टम दृश्य है और इस तरह का निर्माण। दस्तावेज़ मैं कर सकते हैं की तुलना में बेहतर काम करते हैं, उन्हें जांचें!
सुविधा प्रारंभकर्ताओं का उपयोग तब किया जाता है जब आपके पास बहुत सारी संपत्तियों के साथ कुछ वर्ग होता है जो हमेशा उन सभी चर के साथ बुद्धिमानी को "दर्दनाक" बनाता है, तो आप सुविधा प्रारंभकर्ता के साथ क्या करते हैं यह है कि आप बस कुछ पास करते हैं ऑब्जेक्ट को प्रारंभ करने के लिए चर के, और बाकी को डिफ़ॉल्ट मान के साथ असाइन करें। रे वेंडरलिच वेबसाइट पर एक बहुत अच्छा वीडियो है, यह सुनिश्चित नहीं है कि यह मुफ्त है या नहीं क्योंकि मेरे पास एक भुगतान खाता है। यहां एक उदाहरण है जहां आप देख सकते हैं कि मेरे ऑब्जेक्ट को उन सभी चर के साथ शुरू करने के बजाय मैं इसे एक शीर्षक दे रहा हूं।
struct Scene {
var minutes = 0
}
class Movie {
var title: String
var author: String
var date: Int
var scenes: [Scene]
init(title: String, author: String, date: Int) {
self.title = title
self.author = author
self.date = date
scenes = [Scene]()
}
convenience init(title:String) {
self.init(title:title, author: "Unknown", date:2016)
}
func addPage(page: Scene) {
scenes.append(page)
}
}
var myMovie = Movie(title: "my title") // Using convenicence initializer
var otherMovie = Movie(title: "My Title", author: "My Author", date: 12) // Using a long normal initializer
Apple Developer portal से लिया गया एक सरल उदाहरण है।
मूल रूप से नामित प्रारंभकर्ता init(name: String)
है, यह सुनिश्चित करता है कि सभी संग्रहीत गुण प्रारंभ हो जाएं।
init()
सुविधा प्रारंभकर्ता, कोई तर्क ले, स्वत: [Unnamed]
करने के लिए name
संग्रहीत संपत्ति के मूल्य नामित प्रारंभकर्ता का उपयोग करके निर्धारित करता है।
class Food {
let name: String
// MARK: - designated initializer
init(name: String) {
self.name = name
}
// MARK: - convenience initializer
convenience init() {
self.init(name: "[Unnamed]")
}
}
// MARK: - Examples
let food = Food(name: "Cheese")
let food = Food()
यह उपयोगी है जब आप कम से कम कुछ संग्रहीत गुणों के साथ, बड़े वर्गों के साथ काम कर रहे हैं। मैं कम से Apple Developer portal.
नोट optionals और विरासत के बारे में कुछ अधिक पढ़ने के लिए सिफारिश करेंगे: पूरे पाठ
मनोनीत initializers एक वर्ग के लिए प्राथमिक initializers हैं पढ़ें। एक नामित प्रारंभकर्ता पूरी तरह से उस वर्ग द्वारा पेश की गई सभी संपत्तियों को प्रारंभ करता है और सुपरक्लास श्रृंखला तक प्रारंभिक प्रक्रिया को जारी रखने के लिए उपयुक्त सुपरक्लास प्रारंभकर्ता को कॉल करता है।
सुविधा प्रारंभकर्ता द्वितीयक हैं, जो कक्षा के लिए प्रारंभिक समर्थनकर्ता हैं। आप सुविधा प्रारंभकर्ता के रूप में एक ही नाम से एक प्रारंभिक प्रारंभकर्ता को कॉल करने के लिए एक सुविधा प्रारंभकर्ता को परिभाषित कर सकते हैं, जिसमें निर्दिष्ट कुछ प्रारंभिक प्रारंभकर्ता पैरामीटर डिफ़ॉल्ट रूप से सेट किए गए हैं।
कक्षाओं के लिए मनोनीत initializers उसी तरह से मूल्य प्रकार के लिए के रूप में सरल initializers लिखा जाता है:
init(parameters) {
statements
}
सुविधा initializers में एक ही शैली में लिखे गए हैं, लेकिन सुविधा संशोधक init कीवर्ड के समक्ष रखा, द्वारा अलग एक अंतरिक्ष:
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "[Unnamed]")
}
}
let namedMeat = Food(name: "Bacon")
// namedMeat's name is "Bacon”
:
convenience init(parameters) {
statements
}
एक व्यावहारिक उदाहरण निम्न हैं
खाद्य वर्ग से प्रारंभिक (नाम: स्ट्रिंग) प्रारंभकर्ता को नामित प्रारंभकर्ता के रूप में प्रदान किया जाता है क्योंकि यह सुनिश्चित करता है कि एक नए खाद्य उदाहरण के सभी संग्रहीत गुण पूरी तरह से प्रारंभ किए गए हैं। खाद्य वर्ग में सुपरक्लास नहीं है, और इसलिए init (नाम: स्ट्रिंग) प्रारंभकर्ता को इसकी शुरुआत को पूरा करने के लिए super.init() को कॉल करने की आवश्यकता नहीं है।
"खाद्य वर्ग भी कोई तर्क के साथ सुविधा प्रारंभकर्ता, init() प्रदान करता है। init() प्रारंभकर्ता खाद्य वर्ग के init करने के लिए भर में सौंपने के द्वारा एक नया भोजन के लिए एक डिफ़ॉल्ट प्लेसहोल्डर नाम प्रदान करता है: का एक नाम मान के साथ (नाम स्ट्रिंग) [अनाम]: "
“let mysteryMeat = Food()
// mysteryMeat's name is "[Unnamed]”
पदानुक्रम में द्वितीय श्रेणी रेसिपीइंजेंटेंट नामक खाद्य पदार्थ का उप-वर्ग है। रेसिपीइंजेंटेंट क्लास एक खाना पकाने की विधि में एक घटक का मॉडल करता है।
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
override convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
RecipeIngredient वर्ग एक ही नामित प्रारंभकर्ता है, init (नाम:: यह और RecipeIngredient उदाहरणों बनाने के लिए दो initializers को परिभाषित करता है (नाम संपत्ति यह खाद्य से विरासत के अलावा) एक इंट संपत्ति मात्रा कहा जाता है का परिचय स्ट्रिंग, मात्रा: Int), जिसका उपयोग एक नई पकाने की विधि के सभी गुणों को पॉप्युलेट करने के लिए किया जा सकता है। यह प्रारंभकर्ता मात्रा संपत्ति को पारित मात्रा तर्क को असाइन करके शुरू होता है, जो कि रेसिपीइंजेंटेंट द्वारा पेश की जाने वाली एकमात्र नई संपत्ति है। ऐसा करने के बाद, प्रारंभकर्ता खाद्य वर्ग के इनिट (नाम: स्ट्रिंग) प्रारंभकर्ता तक प्रतिनिधि करता है।
पृष्ठ: 536 उद्धरण: ऐप्पल इंक। "स्विफ्ट प्रोग्रामिंग भाषा (स्विफ्ट 4)।" IBooks। https://itunes.apple.com/pk/book/the-swift-programming-language-swift-4-0-3/id881256329?mt=11
- 1. window.onload = init() के बीच क्या अंतर है; और window.onload = init;
- 2. विस्तार UIAlertController सुविधा init चेतावनी
- 3. क्या() init के बीच का अंतर और __construct (है) तरीकों
- 4. स्विफ्ट और init (windowNibName) में NSWindowController उपclassing
- 5. NSMutableArray -init बनाम + arrayWithCapacity:
- 6. वानर बॉक्स बनाम बनाम योनि init?
- 7. `std :: ios_base :: init :: init() '
- 8. स्विफ्ट में NSDictionary बनाम शब्दकोश के बीच क्या अंतर है?
- 9. अगर (स्वयं = [सुपर init]) बनाम अगर ((स्वयं = [सुपर init]))
- 10. वसंत @PostConstruct बनाम init-method विशेषता
- 11. के बीच मतभेद: init-state बनाम: बिल्ड फ़ंक्शन पर राज्य
- 12. स्विफ्ट NSCountedSet सरणी बग के साथ init?
- 13. जब Global.asax में बनाम Init Application_Start उपयोग करने के लिए?
- 14. __construct() और init()
- 15. UIViewController (init और initWithNibName)
- 16. UIViewController init बनाम initWithNibName: बंडल:
- 17. एप्लेट जीवन चक्र: init() और प्रारंभ(), और नष्ट() और रोकें() के बीच व्यावहारिक अंतर क्या है?
- 18. 'init()' को बहिष्कृत किया गया है: init() स्विफ्ट 3 में हटा दिया जाएगा। `Nil`
- 19. NSMutableArray alloc init बनाम NSMutableArray सरणी
- 20. मानचित्र में init() का उपयोग()
- 21. ऑब्जेक्टिव-सी NSArray init बनाम initWithCapacity: 0
- 22. Zend फ्रेमवर्क: नियंत्रक वस्तुओं में init() और preDispatch() कार्यों के बीच क्या अंतर है?
- 23. आईओएस में [कक्षा नई] और [[कक्षा आवंटन] init] के बीच क्या अंतर है?
- 24. वसंत में बीनपोस्टप्रोसेसर और init/नष्ट विधि के बीच क्या अंतर है?
- 25. स्विफ्ट प्रोटोकॉल एक्सटेंशन स्वयं संदर्भ मुद्दों init
- 26. जावा: <init> और <clinit> के बीच क्या अंतर है?
- 27. UIView init
- 28. आईओएस: व्यू कंट्रोलर के -init और -viewLoad के बीच क्या अंतर है?
- 29. क्या "प्रवेश बिंदु" NPM init
- 30. ViewController init?
क्या आपने [प्रारंभिकरण] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18- आईडी 203) [स्विफ्ट प्रोग्रामिंग भाषा] का अनुभाग (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics।एचटीएमएल # // apple_ref/डॉक्टर/यूआईडी/टीपी 40014097-सीएच 5-आईडी 30 9) पुस्तक? आपका भ्रम वास्तव में क्या है? – rmaddy
एसओ में पहले से ही उपलब्ध उत्तर उपलब्ध हैं। कृपया देखें - http://stackoverflow.com/questions/30896231/why-convenience-keyword-is-even-needed-in-wift – Santosh