swift - ढांचे में संरचना के लिए तुच्छ प्रोटोकॉल अनुरूपता घोषित करें




struct linker (2)

क्या यह एक संरचना को परिभाषित करना संभव है, एक ढांचे में परिभाषित किया गया है, जो किसी भी प्रोटोकॉल के अनुरूप है, जो मेरे ऐप में परिभाषित है?

कहते हैं, उदाहरण के लिए, मेरे पास एपीआई है जो ढांचे में तैयार किए गए कुछ विगेट्स के लिए स्ट्रैक्ट्स की घोषणा करता है:

public struct VagueWidget {
    public let temperature: Float
}

public struct SpecificWidget {
    public let calibratedTemperature: Float
    public let movingAverageTemperature: Float
}

public struct SuperSpecificWidget {
    public let surfaceTemperature: Float
    public let inferredCoreTemperature: Int?
}

और फिर मेरे आवेदन में मैं इन्हें प्रोटोकॉल के माध्यम से सामान्य बनाना चाहता हूं।

protocol Widget {
    var temperature: Float { get }
}

मेरे आवेदन में मैं एपीआई में उन लोगों के समान स्ट्रैक्ट्स घोषित कर सकता हूं, और तुच्छ रूप से उन्हें प्रोटोकॉल के अनुरूप होने की घोषणा कर रहा हूं।

struct MockWidget {
    let temperature: Float
}

extension MockWidget: Widget {}

और फिर मैं ढांचा में स्ट्रैक्ट्स के लिए प्रोटोकॉल अनुरूपता घोषित कर सकता हूं।

extension SuperSpecificWidget: Widget {
    var temperature: Float {
        get {
            return surfaceTemperature
        }
    }
}

extension SpecificWidget: Widget {
    var temperature: Float {
        get {
            return calibratedTemperature
        }
    }
}

extension VagueWidget: Widget {}

यह कोड संकलित करता है, लेकिन लिंक नहीं करता ढांचा में तुच्छ रूप से अनुरूप VagueWidget जो अनुपलब्ध प्रतीक में अनुप्रयोग परिणामों में MockWidget समतुल्य है:

Undefined symbols for architecture x86_64:
  "WidgetAPI.VagueWidget.temperature.getter : Swift.Float", referenced from:
   protocol witness for WidgetApp.Widget.temperature.getter : Swift.Float in conformance WidgetAPI.VagueWidget : WidgetApp.Widget in WidgetApp in AppModel.o

VagueWidget लिए तुच्छ प्रोटोकॉल अनुरूपता को टिप्पणी करते हुए कोड तैयार करता है जो संकलित और चलाता है, लेकिन जाहिर है वांछित प्रोटोकॉल अनुरूपता मैंने गिथूब पर एक उदाहरण प्रोजेक्ट जोड़ा है

अद्यतन: यह एक ज्ञात समस्या प्रतीत होता है मैंने एक रडार दायर किया है, और इसे 20648441 की डुप्लिकेट के रूप में बंद कर दिया गया है।


दिलचस्प बग आप पाए आप और स्कॉट एच ने सभी काम किया था, लेकिन कुछ काम करने के साथ झंकारना चाहता था:

  1. अपने मॉडल को struct से class बदलें पता नहीं क्यों यह काम करता है

  2. फ़ंक्शंस भी काम करते हैं (यानी func temperature() -> Float )।

दोनों आदर्श से कम हैं


extension WidgetAPI.VagueWidget: Widget {
    var temperature: Float {
        return self.temperature
    }
}

इसे ठीक करता है को संग्रहीत अपरिवर्तनीय संपत्ति बनाम प्रोटोकॉल में कम्प्यूटेड रीडोनली प्रॉपर्टी के साथ कुछ प्रकार के संघर्ष दिखता है।

अद्यतन: कोई बात नहीं, मैं सिर्फ अनन्त recursion की खोज की। अभी भी वहाँ कुछ की तरह लगता है





protocols