स्विफ्ट में मैं स्पष्ट रूप से इस प्रकार घोषित करके एक चर का प्रकार निर्धारित कर सकता हूं:
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
चर घोषणा में अनुरूप है ?
औचित्य
यदि आप फ़ैक्टरी पैटर्न से परिचित हैं, तो यह एक विशेष वर्ग की वस्तुओं को वापस करने में सक्षम होने के संदर्भ में समझ में आता है जो एक निश्चित इंटरफ़ेस को लागू करते हैं।
मेरे उदाहरण की तरह, कभी-कभी हम ऐसे इंटरफेस को परिभाषित करना पसंद करते हैं जो किसी विशेष वस्तु पर लागू होने पर समझ में आता है। टेबल व्यू सेल का मेरा उदाहरण एक ऐसा औचित्य है।
जब भी आपूर्ति की गई प्रकार उल्लिखित इंटरफ़ेस के अनुरूप नहीं होती है, फैक्ट्री रिटर्न करती है और इसलिए मैं बेस क्लास प्रकार और घोषित प्रोटोकॉल इंटरफ़ेस दोनों के साथ बातचीत करने में लचीलापन चाहूंगा।
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
। यह ऑब्जेक्ट काफी बेकार लगता है क्योंकि NSSomething
पहले से ही पता है कि यह किसके अनुरूप है। यदि यह प्रोटोकॉल में से किसी एक के अनुरूप नहीं है, <>
तो आपको unrecognised selector ...
क्रैश मिल जाएगा । यह किसी भी प्रकार की सुरक्षा प्रदान नहीं करता है।