दिलचस्प पोस्ट
मैं HTML विशेषता मानों में उद्धरणों से कैसे बच सकता हूं? Log4J: लॉगर इंस्टेंस बनाने की रणनीतियां C / Objective-C में कई पंक्तियों में एक स्ट्रिंग को अक्षरशः विभाजित कैसे करें? कैसे एक JTabbedPane टैब करने के लिए करीब बटन जोड़ने के लिए? जावास्क्रिप्ट फ़ंक्शन आवरण का उपयोग क्यों करें (coffeescript में जोड़ा गया है) ".call (this)" प्रश्न चिह्न के बाद रेगेक्स सब कुछ मैच? द्विआधारी कोड में एक स्ट्रिंग कैसे छिपाएगी? मैं उपयोगकर्ता नियंत्रण में एक घटना कैसे बना सकता हूं और इसे मुख्य प्रपत्र में हैंडल किया है? एसीसीआई को बचने के लिए यूसीआईडीई स्ट्रिंग बचाना पृष्ठभूमि छवि के साथ त्रिभुज का आकार एएसपी। नेट पहचान में दावा क्या है eventlisteners वसंत 3.1.0 के साथ हाइबरनेट 4.0 का उपयोग करते हुए .release? सी प्रोग्राम में वर्तमान निर्देशिका कैसे प्राप्त करें? आप एक मोंगोज़ क्वेरी द्वारा दिए गए डेटा को संशोधित क्यों नहीं कर सकते (उदा: खोजबीआईआईडी) Ggplot2 में फोंट संशोधित करना

स्विफ्ट में, मैं एक विशिष्ट प्रकार के एक चर को कैसे घोषित कर सकता हूं जो एक या अधिक प्रोटोकॉल के अनुरूप है?

स्विफ्ट में मैं स्पष्ट रूप से इस प्रकार घोषित करके एक चर प्रकार को सेट कर सकता हूं:

var object: TYPE_NAME 

अगर हम इसे एक कदम आगे ले जाना चाहते हैं और एक वैरिएबल घोषित करना चाहते हैं जो कई प्रोटोकॉल के अनुरूप है, तो हम protocol घोषणापत्र का उपयोग कर सकते हैं:

 var object: protocol<ProtocolOne,ProtocolTwo>//etc 

क्या होगा अगर मैं एक वस्तु को घोषित करना चाहूंगा जो एक या अधिक प्रोटोकॉल के अनुरूप है और यह भी एक विशिष्ट आधार वर्ग प्रकार का है? उद्देश्य-सी समतुल्य ऐसा दिखेगा:

 NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...; 

स्विफ्ट में मैं उम्मीद करता हूं कि यह इस तरह दिखता है:

 var object: TYPE_NAME,ProtocolOne//etc 

यह हमें आधार प्रकार के कार्यान्वयन के साथ ही प्रोटोकॉल में परिभाषित इंटरफ़ेस से निपटने में सक्षम होने का लचीलापन देता है।

क्या एक और और स्पष्ट तरीका है कि मैं याद कर सकता हूं?

उदाहरण

एक उदाहरण के रूप में, कहें कि मेरे पास एक UITableViewCell कारखाना है जो एक प्रोटोकॉल के अनुरूप सेल लौटने के लिए जिम्मेदार है। हम आसानी से एक जेनेरिक फ़ंक्शन को सेट कर सकते हैं जो एक प्रोटोकॉल के अनुरूप कोशिका देता है:

 class CellFactory { class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T { //etc } } 

बाद में मैं इन कोशिकाओं को दोनों प्रकार और प्रोटोकॉल का लाभ उठाने के दौरान हटाना चाहता हूं

 var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell 

यह एक त्रुटि देता है क्योंकि तालिका व्यू सेल प्रोटोकॉल के अनुरूप नहीं है …

मुझे यह निर्दिष्ट करने में सक्षम होना चाहिए कि सेल एक UITableViewCell और MyProtocol को चर घोषणापत्र में पुष्टि करता है?

औचित्य

यदि आप फैक्ट्री पैटर्न से परिचित हैं, तो यह एक विशिष्ट वर्ग की वस्तुओं को वापस करने में सक्षम होने के संदर्भ में एक विशिष्ट इंटरफ़ेस को लागू करने में सक्षम होगा।

मेरे उदाहरण की तरह, कभी-कभी हम एक विशिष्ट वस्तु पर लागू होने वाले इंटरफेस को परिभाषित करना पसंद करते हैं। टेबल व्यू सेल का मेरा उदाहरण एक ऐसा औचित्य है।

जब तक आपूर्ति की गई बात ठीक तरह से उल्लिखित इंटरफ़ेस के अनुरूप नहीं होती, फ़ैक्ट्री को लौटाने वाला ऑब्जेक्ट करता है और इसलिए मैं बेस क्लास प्रकार और घोषित प्रोटोकॉल इंटरफ़ेस दोनों के साथ बातचीत करने में लचीलापन चाहूंगा

Solutions Collecting From Web of "स्विफ्ट में, मैं एक विशिष्ट प्रकार के एक चर को कैसे घोषित कर सकता हूं जो एक या अधिक प्रोटोकॉल के अनुरूप है?"

स्विफ्ट 4 में अब एक वैरिएबल घोषित करना संभव है जो कि एक प्रकार का उपवर्ग है और एक ही समय में एक या एक से अधिक प्रोटोकॉल लागू करता है।

 var myVariable: MyClass & MyProtocol & MySecondProtocol 

या एक विधि के पैरामीटर के रूप में:

 func shakeEm(controls: [UIControl & Shakeable]) {} 

एप्पल ने सत्र 402 में WWDC 2017 में इसकी घोषणा की : स्विफ्ट में नया क्या है

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

आप जैसे वैरिएबल की घोषणा नहीं कर सकते

 var object:Base,protocol<ProtocolOne,ProtocolTwo> = ... 

ना ही फ़ंक्शन रिटर्न टाइप की तरह ही घोषित करें

 func someFunc() -> Base,protocol<MyProtocol,Protocol2> { ... } 

आप इस तरह एक फ़ंक्शन पैरामीटर के रूप में घोषित कर सकते हैं, लेकिन यह मूल रूप से अप-कास्टिंग है।

 func someFunc<T:Base where T:protocol<MyProtocol1,MyProtocol2>>(val:T) { // here, `val` is guaranteed to be `Base` and conforms `MyProtocol` and `MyProtocol2` } class SubClass:BaseClass, MyProtocol1, MyProtocol2 { //... } let val = SubClass() someFunc(val) 

अब तक, आप ऐसा कर सकते हैं जैसे:

 class CellFactory { class func createCellForItem(item: SpecialItem) -> UITableViewCell { return ... // any UITableViewCell subclass } } let cell = CellFactory.createCellForItem(special) if let asProtocol = cell as? protocol<MyProtocol1,MyProtocol2> { asProtocol.protocolMethod() cell.cellMethod() } 

इसके साथ, तकनीकी रूप से cell asProtocol समान है।

लेकिन, कंपाइलर के लिए, cell में केवल asProtocol का इंटरफ़ेस है, जबकि asProtocol में केवल प्रोटोकॉल इंटरफ़ेस है। इसलिए, जब आप UITableViewCell के तरीकों को कॉल करना चाहते हैं, तो आपको cell वैरिएबल का उपयोग करना होगा जब आप प्रोटोकॉल विधि कॉल करना चाहते हैं, तो asProtocol वैरिएबल के रूप में उपयोग करें।

यदि आप सुनिश्चित हैं कि सेल प्रोटोकॉल के अनुरूप है, तो आपको इसका उपयोग करने की आवश्यकता नहीं है if let ... as? ... {} if let ... as? ... {} पसंद:

 let cell = CellFactory.createCellForItem(special) let asProtocol = cell as protocol<MyProtocol1,MyProtocol2> 

दुर्भाग्य से, स्विफ्ट वस्तु स्तर प्रोटोकॉल अनुरूपता का समर्थन नहीं करता। हालांकि, कुछ हद तक अजीब काम है-जो कि आपके उद्देश्यों को पूरा कर सकता है।

 struct VCWithSomeProtocol { let protocol: SomeProtocol let viewController: UIViewController init<T: UIViewController>(vc: T) where T: SomeProtocol { self.protocol = vc self.viewController = vc } } 

फिर, कहीं भी आपको कुछ भी करने की आवश्यकता होती है जो कि UIViewController है, आप संरचना के। ViewController पहलू तक पहुंच सकते हैं और आपको प्रोटोकॉल पहलू की आवश्यकता है, तो आप .protocol का संदर्भ लेंगे।

उदाहरण के लिए:

 class SomeClass { let mySpecialViewController: VCWithSomeProtocol init<T: UIViewController>(injectedViewController: T) where T: SomeProtocol { self.mySpecialViewController = VCWithSomeProtocol(vc: injectedViewController) } } 

अब कभी भी आपको अपने विशिष्ट विशेषज्ञ नियंत्रक से संबंधित कुछ भी करने की जरूरत है, आप केवल mySpecialViewController.viewController का संदर्भ देते हैं और जब भी आपको कुछ प्रोटोकॉल फ़ंक्शन करने की आवश्यकता होती है, तो आप mySpecialViewController.protocol का संदर्भ देते हैं।

उम्मीद है कि स्विफ्ट 4 हमें भविष्य में इसके साथ जुड़े प्रोटोकॉल के साथ किसी वस्तु को घोषित करने की अनुमति देगा। लेकिन अभी के लिए, यह काम करता है

उम्मीद है की यह मदद करेगा!

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

उदाहरण:

 @objc protocol SomeInteractorInputProtocol { func getSomeString() } @objc protocol SomeInteractorOutputProtocol { optional func receiveSomeString(value:String) } @objc class SomeInteractor: NSObject, SomeInteractorInputProtocol { @IBOutlet var outputReceiver : AnyObject? = nil private var protocolOutputReceiver : SomeInteractorOutputProtocol? { get { return self.outputReceiver as? SomeInteractorOutputProtocol } } func getSomeString() { let aString = "This is some string." self.protocolOutputReceiver?.receiveSomeString?(aString) } } 

"आउटपुट रिसीवर" को वैकल्पिक घोषित किया गया है, जैसा कि निजी "प्रोटोकॉल आउटपुट रीसेवर" है उत्तरार्द्ध (गणनाकृत संपत्ति) के माध्यम से आउटपुट रिसीवर (उर्फ प्रतिनिधि) तक हमेशा तक पहुंचने से, मैं किसी भी ऑब्जेक्ट को प्रभावी ढंग से फ़िल्टर कर देता हूं जो प्रोटोकॉल के अनुरूप नहीं हैं I अब मैं बस वैकल्पिक चेनिंग का उपयोग प्रतिनिधि अधिकार के लिए सुरक्षित रूप से कॉल करने के लिए कर सकता हूं कि यह प्रोटोकॉल लागू करता है या यहां तक ​​कि मौजूद है या नहीं।

अपनी स्थिति में इसे लागू करने के लिए, आप सार्वजनिक रूप से "YourBaseClass" प्रकार के हो सकते हैं? (किसी भी ऑब्जेक्ट के विपरीत), और प्रोटोकॉल अनुरूपता को लागू करने के लिए निजी कम्प्यूट की गई संपत्ति का उपयोग करें। FWIW।

संपादित करें: मैं गलत था , लेकिन अगर कोई मेरे जैसे गलतफहमी को पढ़ता है, तो मैं इस जवाब को वहां से छोड़ देता हूं। ओपी ने एक दिए गए उपवर्ग के उद्देश्य के प्रोटोकॉल अनुरूपता की जाँच करने के बारे में पूछा, और वह एक और कहानी है जो स्वीकार्य जवाब दिखाती है। बेस क्लास के लिए प्रोटोकॉल अनुरूपता के बारे में यह उत्तर वार्ता है।

शायद मैं गलत हूँ, लेकिन क्या आप UITableCellView क्लास के लिए प्रोटोकॉल अनुरूपता जोड़ने के बारे में बात नहीं कर रहे हैं? उस मामले में प्रोटोकॉल आधार वर्ग तक बढ़ा है, और ऑब्जेक्ट नहीं है। एक्स्टेंशन के साथ प्रोटोकॉल एडॉप्शन घोषित करने पर एप्पल के दस्तावेज देखें, जो आपके मामले में कुछ ऐसा होगा:

 extension UITableCellView : ProtocolOne {} // Or alternatively if you need to add a method, protocolMethod() extension UITableCellView : ProcotolTwo { func protocolTwoMethod() -> String { return "Compliant method" } } 

पहले से ही संदर्भित स्विफ्ट प्रलेखन के अलावा, नट कुक्स आलेख देखें और अधिक उदाहरणों के साथ असंगत प्रकारों के लिए जेनेरिक फ़ंक्शन ।

यह हमें आधार प्रकार के कार्यान्वयन के साथ ही प्रोटोकॉल में परिभाषित इंटरफ़ेस से निपटने में सक्षम होने का लचीलापन देता है।

क्या एक और और स्पष्ट तरीका है कि मैं याद कर सकता हूं?

प्रोटोकॉल गोद लेने से ऐसा ही होगा, एक ऑब्जेक्ट दिए गए प्रोटोकॉल का पालन करें। हालांकि प्रतिकूल पक्ष के बारे में पता है, कि किसी दिए गए प्रोटोकॉल प्रकार का एक चर प्रोटोकॉल के बाहर कुछ भी नहीं जानता है। लेकिन यह एक प्रोटोकॉल को परिभाषित करके बाधित किया जा सकता है जिसमें सभी आवश्यक विधियों / वैरिएबल / …

जब तक आपूर्ति की गई बात ठीक तरह से उल्लिखित इंटरफ़ेस के अनुरूप नहीं होती, फ़ैक्ट्री को लौटाने वाला ऑब्जेक्ट करता है और इसलिए मैं बेस क्लास प्रकार और घोषित प्रोटोकॉल इंटरफ़ेस दोनों के साथ बातचीत करने में लचीलापन चाहूंगा

यदि आप एक सामान्य विधि के लिए चाहते हैं, एक प्रोटोकॉल और आधार वर्ग प्रकार दोनों के अनुरूप चर, तो आप भाग्य से बाहर हो सकते हैं। लेकिन ऐसा लगता है कि आपको प्रोटोकॉल को परिभाषित करने के लिए पर्याप्त रूप से आवश्यक अनुरूपता पद्धतियों को परिभाषित करने की आवश्यकता है, और एक ही समय में पर्याप्त रूप से संकीर्ण होने के लिए पर्याप्त कक्षाओं के बिना कक्षाओं को अपनाने का विकल्प प्राप्त करने की आवश्यकता है (यानी केवल यह बताए कि एक वर्ग को मसविदा बनाना)।