2016-10-17 11 views
12

मुझे दोनों के बीच अंतर या सुविधा init के उद्देश्य को समझने में परेशानी हो रही है। धन्यवादस्विफ्ट में सुविधा init बनाम init के बीच क्या अंतर है, स्पष्ट उदाहरण बेहतर

+0

क्या आपने [प्रारंभिकरण] (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

+1

एसओ में पहले से ही उपलब्ध उत्तर उपलब्ध हैं। कृपया देखें - http://stackoverflow.com/questions/30896231/why-convenience-keyword-is-even-needed-in-wift – Santosh

उत्तर

17

स्टैंडर्ड init:

मनोनीत initializers एक वर्ग के लिए प्राथमिक initializers हैं। नामित प्रारंभकर्ता पूरी तरह से द्वारा पेश की जाने वाली सभी गुणों को प्रारंभ करता है और सुपरक्लास श्रृंखला को प्रारंभिक प्रक्रिया जारी रखने के लिए उपयुक्त सुपरक्लास प्रारंभकर्ता को कॉल करता है।

convenience init:

सुविधा initializers एक वर्ग के लिए initializers समर्थन माध्यमिक हैं। डिफ़ॉल्ट नामों पर निर्धारित नामित प्रारंभकर्ता के मानकों के कुछ के साथ सुविधा प्रारंभकर्ता के रूप में एक ही श्रेणी से नामित प्रारंभकर्ता को कॉल करने के लिए आप एक सुविधा प्रारंभकर्ता को परिभाषित कर सकते हैं। आप किसी विशिष्ट उपयोग केस या इनपुट मान प्रकार के लिए उस श्रेणी का उदाहरण बनाने के लिए सुविधा प्रारंभकर्ता को भी परिभाषित कर सकते हैं।

Swift Documentation

के अनुसार मूल रूप से यह सब संक्षेप में इसका मतलब है कि आप एक सुविधा प्रारंभकर्ता का उपयोग तेजी से और अधिक "सुविधाजनक" एक निर्दिष्ट प्रारंभकर्ता बुला बनाना है। तो सुविधाजनक प्रारंभकर्ताओं को 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 है साथ कस्टम दृश्य है और इस तरह का निर्माण। दस्तावेज़ मैं कर सकते हैं की तुलना में बेहतर काम करते हैं, उन्हें जांचें!

11

सुविधा प्रारंभकर्ताओं का उपयोग तब किया जाता है जब आपके पास बहुत सारी संपत्तियों के साथ कुछ वर्ग होता है जो हमेशा उन सभी चर के साथ बुद्धिमानी को "दर्दनाक" बनाता है, तो आप सुविधा प्रारंभकर्ता के साथ क्या करते हैं यह है कि आप बस कुछ पास करते हैं ऑब्जेक्ट को प्रारंभ करने के लिए चर के, और बाकी को डिफ़ॉल्ट मान के साथ असाइन करें। रे वेंडरलिच वेबसाइट पर एक बहुत अच्छा वीडियो है, यह सुनिश्चित नहीं है कि यह मुफ्त है या नहीं क्योंकि मेरे पास एक भुगतान खाता है। यहां एक उदाहरण है जहां आप देख सकते हैं कि मेरे ऑब्जेक्ट को उन सभी चर के साथ शुरू करने के बजाय मैं इसे एक शीर्षक दे रहा हूं।

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 
3

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.

0

नोट 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

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