गैर-वैकल्पिक के माध्यम से स्विफ्ट प्रोटोकॉल वैकल्पिक अनुरूपता

Aug 18 2020

मेरे पास एक वैकल्पिक संपत्ति वाला एक प्रोटोकॉल है।

इस प्रोटोकॉल के अनुरूप अधिकांश प्रकारों में एक मिलान वैकल्पिक संपत्ति होगी। हालांकि, किसी के पास एक ही प्रकार और नाम की गैर-वैकल्पिक संपत्ति है।

protocol SomeProtocol {
    var foo: Int? { get }
}

struct StructA: SomeProtocol {
    let foo: Int?
}

struct StructB: SomeProtocol {
    let foo: Int // Type 'StructB' does not conform to protocol 'SomeProtocol'
}

Xcode के "फिक्स -" क्या आप प्रोटोकॉल स्टब्स जोड़ना चाहते हैं? बटन संपत्ति का वैकल्पिक संस्करण जोड़ता है, लेकिन संरचना में अब अमान्य डुप्लिकेट चर नाम हैं:

struct StructB: SomeProtocol {
    let foo: Int
    var foo: Int? { return foo } // Invalid redeclaration of 'foo'
}

एक { get }मामले में, मैंने मान लिया था कि यह गैर-वैकल्पिक के कारण "बस काम करेगा" वैकल्पिक की बाधाओं को हमेशा संतुष्ट करता है, इसी तरह आप एक वैकल्पिक रिटर्न प्रकार के साथ एक फ़ंक्शन में गैर-वैकल्पिक कैसे वापस कर सकते हैं। लेकिन जाहिर है कि ऐसा नहीं है।

यह कार्यों के लिए भी समान काम करता है; एक प्रोटोकॉल func bar() -> Int?एक अनुरूप प्रकार की घोषणा से संतुष्ट नहीं है func bar() -> Int

क्या इस मुद्दे के आसपास कोई रास्ता है? मैं वेरिएबल्स का नाम नहीं बदलना चाहूंगा या मध्यवर्ती गेटर्स जोड़ना चाहूंगा।

क्या इस स्थिति को स्विफ्ट के लिए माना गया है? एक वैकल्पिक प्रोटोकॉल चर को संतुष्ट करने के लिए गैर-वैकल्पिक की अनुमति नहीं देने के लिए तर्कसंगत क्या है?

जवाब

pkamb Aug 19 2020 at 00:34

यदि प्रोटोकॉल एक डिफ़ॉल्ट कार्यान्वयन प्रदान करता है जो एक वैकल्पिक रिटर्न देता है:

protocol SomeProtocol {
    var foo: Int? { get }
}

extension SomeProtocol {
    var foo: Int? { return nil }
}

प्रोटोकॉल-अनुरूप प्रकार तब चर / फ़ंक्शन का एक ओवरराइडिंग गैर-वैकल्पिक संस्करण प्रदान कर सकते हैं:

struct StructB: SomeProtocol {
    let foo: Int
}

मुझे यह स्विफ्ट इवोल्यूशन फोरम पर चर्चा में मिला:

पहली नज़र में मुझे लगा कि एक नियम है जो हमें गैर-वैकल्पिक प्रकारों के साथ प्रोटोकॉल आवश्यकताओं को पूरा करने की अनुमति देता है, लेकिन इसके परिणामस्वरूप त्रुटि हुई। आगे की जांच के बाद ही मैंने देखा कि एक गैर-वैकल्पिक संस्करण के साथ आवश्यकता को 'ओवरराइड' करने के लिए एक डिफ़ॉल्ट कार्यान्वयन मौजूद होना चाहिए।

https://forums.swift.org/t/how-does-this-rule-work-in-regard-of-ambiguity/19448

यह स्विफ्ट टीम गैर-वैकल्पिक प्रकारों को वैकल्पिक-मूल्य प्रोटोकॉल को पूरा करने की अनुमति देने पर भी चर्चा करती है:

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

हाँ, पूरी तरह से! उस हिस्से को छोड़कर जहां यह मौजूदा कोड के व्यवहार को बदलता है, इसलिए हमें इसके बारे में बहुत सावधान रहना होगा। इसे [SR-522] का हिस्सा माना जाता है, प्रोटोकॉल फ़न में सहसंयोजक रिटर्न नहीं हो सकता है

जिसे स्टैक ओवरफ्लो पर ट्रैक किया गया है:

एक प्रोटोकॉल में केवल संपत्ति की आवश्यकता क्यों नहीं हो सकती है जो एक संपत्ति के अनुरूप हो?