2017-02-27 11 views
9

मैं एक प्रोटोकॉल प्रकार मैं के लिए एक बंद बनाने के लिए कोशिश कर रहा हूँ, लेकिन मैं निम्न त्रुटिस्टेटिक सदस्य प्रोटोकॉल Metatype स्विफ्ट पर नहीं किया जा सकता

स्टेटिक सदस्य 'menuItemSorter' पर नहीं किया जा सकता हो रही है प्रोटोकॉल मेटाटाइप 'MenuItem.Protocol'

यहां मेरे कोड का एक कम संस्करण है जिसे मैं एक खेल के मैदान में चलाने की कोशिश कर रहा हूं।

protocol MenuItem { 
    var order: Int {get} 
} 

extension MenuItem { 
    static var menuItemSorter: (MenuItem, MenuItem) -> Bool { 
     return { $0.order < $1.order } 
    } 
} 

class BigItem : MenuItem { 
    var order: Int = 1 
} 

let bigItems = [BigItem(), BigItem()] 

let sorter = MenuItem.menuItemSorter 

मैं MenuItem पर एक वर्ग/स्थिर वर विधि है कि menuItems सॉर्ट कर सकते हैं करने में सक्षम होना चाहते हैं, यह करने के लिए सबसे अच्छा तरीका क्या है?

+0

की संभावित डुप्लिकेट [स्विफ्ट: एक प्रोटोकॉल विस्तार में एक डिफ़ॉल्ट प्रोटोकॉल कार्यान्वयन प्रदान करना] (http://stackoverflow.com/questions/35043292/swift

आप इसे एक प्रकार से पालन कॉल करने की आवश्यकता -प्रोवाइडिंग-ए-डिफॉल्ट-प्रोटोकॉल-कार्यान्वयन-इन-ए-प्रोटोकॉल-एक्सटेंशन) – Hamish

+0

आपकी विशेष कॉन्फ़िगरेशन सुरक्षित हो सकती है, लेकिन मान लीजिए कि 'menuItemSorter' का कार्यान्वयन' MenuItem' की अन्य स्थिर आवश्यकताओं तक पहुंचने के लिए स्वतंत्र है, जो हो सकता है डिफ़ॉल्ट कार्यान्वयन नहीं है। – Hamish

उत्तर

17

प्रोटोकॉल के आपके शेष कोड से एक सुलभ इंटरफ़ेस नहीं है।

class BigItem: MenuItem { 
    var order: Int = 1 
} 

let sorter = BigItem.menuItemSorter 
+0

धन्यवाद। स्विफ्ट से मुझे एक गूंगा प्रतिबंध लगता है। हो सकता है कि मैं पूरी तरह से सांख्यिकी के लिए एक शीर्ष-स्तर अनुरूप अनुरूप प्रकार पेश करूंगा। – MattD

+2

@MattD फ़ीचर एक बग नहीं है। यह एक प्रोटोकॉल के विचार के खिलाफ चला जाता है। प्रोटोकॉल एक संरचना या वर्ग नहीं है, यह उपयोग करने के लिए एक तरीका है और कार्यक्षमता के एक निश्चित सेट के अनुपालन की घोषणा करता है। प्रोटोकॉल द्वारा पूरी तरह से स्वामित्व वाली स्टोरेज या कार्यक्षमता की अनुमति देना दोनों मौजूदा नियमों को तोड़ देगा, और प्रोटोकॉल और कक्षा के बीच किसी भी सार्थक अंतर को नष्ट कर देगा। – PeejWeej

संबंधित मुद्दे