2016-04-25 27 views
11

मुझे यकीन नहीं है कि मुझे अभी कोई जानकारी नहीं मिली है या यदि यह संभव नहीं है।स्विफ्ट: कोरडाटा और जेनेरिक NSOrderedSet

मैंने कई पेज देखे हैं। मैं स्विफ्ट में NSOrderedSet के सामान्य जेनेरिक संस्करण का उपयोग करना चाहता हूं।

स्विफ्ट के सेट प्रकार फाउंडेशन के NSSet वर्ग के लिए पाट है:

एक सेट आप यह कर सकते हैं के साथ

। स्रोत: Apple Docs - Sets

एक NSManagedObject उपवर्ग में आप बस सेट करने के लिए NSSet को बदल सकते हैं और यह काम करेंगे। (यह परीक्षण किया गया)

@property NSArray<NSDate *> *dates; 
@property NSSet<NSString *> *words; 
@property NSDictionary<NSURL *, NSData *> *cachedData; 

var dates: [NSDate] 
var words: Set<String> 
var cachedData: [NSURL: NSData] 

स्रोत: Apple Docs - Lightweight Generics

लेकिन मैं एक स्विफ्ट में सेट का आदेश दिया करने के लिए किसी भी संदर्भ नहीं मिल सका। मैं उद्देश्य-सी से NSOrderedSet का उपयोग कर सकता हूं लेकिन मेरे पास स्विफ्ट में जेनरिक नहीं होगा।

स्विफ्ट में एक सेट में ऑर्डर को परिभाषित करने की कोई संभावना है?

उत्तर

10

नहीं, स्विफ्ट में और सभी ईमानदारी में कोई आदेश निर्धारित नहीं है, आपको आदेशित सेट अवधि का उपयोग नहीं करना चाहिए। वे बहुत ही कम उपयोग के हैं।

लेकिन कुछ बार, यह उपयोगी है। तो आपको अपने डेटा को अपने आप सॉर्ट करने की ज़रूरत नहीं है। विशेष रूप से जब आपके पास उप-इकाइयों की एक सूची वाली इकाई होती है तो उन्हें सॉर्ट नहीं किया जाएगा क्योंकि यह एक सेट है। और फिर आपको एक विशिष्ट क्रम में तैयार डेटा रखने के लिए एक सरणी बनाना होगा क्योंकि एक सादा सेट अपना ऑर्डर नहीं रखता है। इसलिए मूल डेटा के लिए यह विशेष रूप से NSFetchedResultsController के उपयोग में उपयोगी है।

यह कोर डेटा के लिए आलसी जोड़ है जो कभी नहीं होना चाहिए था। यह अपने स्वयं के सॉर्ट दिनचर्या लिखने से कहीं अधिक उपयोगी या अधिक प्रदर्शनकारी नहीं है। ऑर्डर किए गए सरणी का उत्पादन करने के लिए सबक्लास में एक सुविधा विधि लिखना NSOrderedSet का उपयोग करने से तेज़ और अधिक प्रदर्शनशील होगा।

जब आप NSFetchedResultsController का उपयोग कर रहे हैं तो यह NSFetchedResultsController आपके लिए सब कुछ ऑर्डर करने के बाद से पूरी तरह बेकार है।

+2

लेकिन कुछ बार, यह उपयोगी है। तो आपको अपने डेटा को अपने आप सॉर्ट करने की ज़रूरत नहीं है। विशेष रूप से जब आपके पास उप-इकाइयों की एक सूची वाली इकाई होती है तो उन्हें सॉर्ट नहीं किया जाएगा क्योंकि यह एक सेट है। और फिर आपको एक विशिष्ट क्रम में तैयार डेटा रखने के लिए एक सरणी बनाना होगा क्योंकि एक सादा सेट अपना ऑर्डर नहीं रखता है। इसलिए मूल डेटा के लिए यह विशेष रूप से NSFetchedResultsController के उपयोग में उपयोगी है। – Maik639

0

मैं मार्कस ज़रारा के उत्तर से सहमत हूं, यह आमतौर पर ऐसी सुविधा नहीं है जो उपयोग करने योग्य है लेकिन कुछ चीजें जोड़ना चाहता है। मैं आमतौर पर स्पष्ट ऑर्डर वैल के लिए एक संपत्ति जोड़ने की अनुशंसा करता हूं जिसे आप सॉर्ट कर सकते हैं।

आदेशित सेट ऐप्पल के लिए कोर डेटा में दूसरे श्रेणी के नागरिक हैं, वे iCloud कोर डेटा स्टोर में समर्थित नहीं थे (हालांकि आमतौर पर उस सिस्टम के साथ समस्याएं थीं और मुझे विश्वास है कि यह अब आम तौर पर बहिष्कृत है)।

स्विफ्ट शर्तों में मूल्य सेमेटिक्स के साथ अपना स्वयं का ऑर्डर सेट लिखना संभव होगा लेकिन इस बिंदु पर फाउंडेशन आदेश सेट से और ब्रिजिंग को सक्षम करने के लिए संभव नहीं है।

यदि आप इसका समर्थन करने के लिए वास्तव में हताश थे तो आप अपने कस्टम ऑर्डर किए गए सेट प्रकार के लिए एक्सेसर्स बनाने के लिए कस्टम कोड जनरेटर लिख सकते हैं (या केवल हाथ से एक्सेसर्स जोड़ सकते हैं)।

निष्कर्ष में ऐसे तरीके हैं जिन्हें आप कर सकते हैं लेकिन इसका मतलब यह नहीं है कि आपको चाहिए।

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