swift - "जहां स्व" खंड के साथ स्विफ्ट प्रोटोकॉल



where swift-protocols (1)

प्रोटोकॉल घोषणाओं पर सुपरक्लास बाधाओं को लगाने की क्षमता (जो कि protocol P where Self : C को परिभाषित करने में सक्षम है protocol P where Self : C जहां C एक वर्ग का प्रकार है) का समय से पहले परिणाम था
SE-0156 , और सिंटैक्स को स्विफ्ट 4.x में अस्वीकार कर दिया जाना चाहिए था जब तक कि सुविधा लागू नहीं की गई थी। स्विफ्ट 4.x में इस फीचर का इस्तेमाल करने की कोशिश करने से stackoverflow.com/a/50647762/2976878 , इसलिए मैं इसे स्विफ्ट 5 तक इस्तेमाल करने से stackoverflow.com/a/50647762/2976878 ।

स्विफ्ट 5 (Xcode 10.2) में अब यह सुविधा लागू हो गई है जारी नोटों से :

प्रोटोकॉल अब उनके अनुरूप प्रकारों को बाध्य कर सकते हैं जो किसी दिए गए वर्ग को उपवर्गित करते हैं। दो समकक्ष रूप समर्थित हैं:

protocol MyView: UIView { /*...*/ }
protocol MyView where Self: UIView { /*...*/ } 

स्विफ्ट 4.2 ने दूसरे रूप को स्वीकार किया, लेकिन यह पूरी तरह से लागू नहीं किया गया था और कभी-कभी संकलन समय या रनटाइम पर क्रैश हो सकता था। ( SR-5581 -5581) (38077232)

यह सिंटैक्स MyView पर एक MyView बाधा MyView जो UIView से विरासत में प्राप्त होने वाले (या होने वाले) प्रकारों को प्रतिबंधित करता है। इसके अलावा, MyView का उपयोग MyView रूप से एक वर्ग अस्तित्व (जैसे UIView & MyView ) के बराबर है, जिसमें आप मूल्य पर प्रोटोकॉल के वर्ग और आवश्यकताओं के दोनों सदस्यों तक पहुंच सकते हैं।

उदाहरण के लिए, रिलीज नोट्स के उदाहरण पर विस्तार:

protocol MyView : UIView {
  var foo: Int { get }
}

class C : MyView {} // error: 'P' requires that 'C' inherit from 'UIView'

class CustomView : UIView, MyView {
  var foo: Int = 0
}

// ...

let myView: MyView = CustomView(frame: .zero)

// We can access both `UIView` members on a `MyView` value
print(myView.backgroundColor as Any)

// ... and `MyView` members as usual.
print(myView.foo)

प्रोटोकॉल एक्सटेंशन के साथ इस सिंटैक्स के अलावा:

protocol P {}
extension P where Self : UIView {}

... मुझे दुर्घटना से पता चला कि आप उसी का उपयोग कर सकते हैं जहां प्रोटोकॉल पर ही खंड:

protocol P where Self : UIView {}

ध्यान दें कि यह जेनेरिक प्रोटोकॉल को बाधित करने वाले क्लॉज़ के समान नहीं है, और यह पी को एक जेनेरिक प्रोटोकॉल नहीं बनाता है।

मेरे प्रयोगों से पता चलता है कि यहाँ केवल एक बृहदान्त्र का उपयोग किया जा सकता है, और बृहदान्त्र के बाद की चीज़ एक कक्षा या एक प्रोटोकॉल (जो सामान्य हो सकती है) होनी चाहिए।

मैं उत्सुक हो गया: यह मेरे नोटिस से कैसे बच गया? इसलिए मैं इस बात के सबूत के लिए गया कि यह कब पैदा हुआ। स्विफ्ट 3.0 में, पूर्व सिंटैक्स कानूनी है, लेकिन बाद वाला नहीं है। स्विफ्ट 3.3 में, दोनों कानूनी हैं। तो बाद के सिंटैक्स को स्विफ्ट 3.2 जैसी किसी चीज़ में चुपचाप पेश किया गया होगा। मैं कहता हूं कि "चुपचाप" क्योंकि मुझे रिलीज नोट्स में इसके बारे में कुछ भी नहीं मिल रहा है।

दूसरा वाक्य रचना किस लिए है? क्या ऐसा प्रतीत होता है, जैसा कि यह सुनिश्चित करने का एक सुविधाजनक तरीका है कि कोई अन्य प्रकार इस प्रोटोकॉल को नहीं अपना सकता है? स्विफ्ट हेडर का कोई फायदा नहीं दिख रहा है।





swift-protocols