Swift में String के साथ Enum: तेज़ी से और बिना परेशानी के कैसे iterate करें?
\n\nक्या आपने कभी Swift में String प्रकार के साथ enum लिखा है और अचानक महसूस किया है कि आप इसे लूप में आसानी से iterate नहीं कर सकते? परिचित लगता है, है ना? यह पल अप्रत्याशित रूप से आता है: आप ऑर्डर स्टेटस, नोटिफिकेशन प्रकार या उत्पाद श्रेणियों के लिए एक सुंदर enumeration बनाते हैं, कोड की सफ़ाई पर गर्व करते हैं, और फिर — बैम! — और कंपाइलर कहता है: '[YourEnum]' is not convertible to 'AnySequence'। या आप सभी संभावित मानों को प्रिंट करने के लिए एक जादुई मंत्र खोजने में 20 मिनट बिताते हैं।
यह लेख बिल्कुल वही है जिसकी आपको आवश्यकता है। हम केवल यह नहीं दिखाएंगे कि Swift में String के साथ enum को कैसे iterate किया जाए। हम प्रत्येक दृष्टिकोण के अनुकूलन और प्रदर्शन का विश्लेषण करेंगे। आप जानेंगे कि एक विकल्प दूसरे की तुलना में 10 गुना तेज़ क्यों काम करता है, और 'सुविधाजनक लेकिन धीमे' कोड के जाल में कैसे न फँसें। चलिए शुरू करते हैं!
\n\nString के साथ Enum सिर्फ एक Enum से अधिक क्यों है?
\n\nSwift में, enum एक शक्तिशाली उपकरण है। और जब आप : String जोड़ते हैं, तो आपको कुछ और मिलता है: प्रत्येक केस का मान एक स्ट्रिंग बन जाता है जिसका उपयोग UI, API या लॉग में किया जा सकता है। लेकिन यहाँ एक समस्या है: डिफ़ॉल्ट रूप से, Swift सभी केसों को iterate करने का कोई अंतर्निहित तरीका प्रदान नहीं करता है। सामान्य enum (बिना raw values के) के लिए, 2019 से CaseIterable प्रोटोकॉल मौजूद है। लेकिन String के साथ? यहाँ कुछ बारीकियाँ हैं।
आइए एक क्लासिक स्थिति देखें:
\n\nenum OrderStatus: String {\n case pending = "Ожидание"\n case confirmed = "Подтверждён"\n case shipped = "Отправлен"\n case delivered = "Доставлен"\n case cancelled = "Отменён"\n}\n\nसब कुछ सुंदर है, लेकिन सभी स्टेटस की एक सूची कैसे प्राप्त करें? यदि आप नौसिखिया हैं, तो आप शायद कुछ इस तरह लिखेंगे:
\n\nlet allStatuses = [OrderStatus.pending, .confirmed, .shipped, .delivered, .cancelled]\n\nकाम करता है? हाँ। इष्टतम? नहीं। और यदि आपके पास 50 केस हैं? और यदि आप एक नया जोड़ते हैं और ऐरे को अपडेट करना भूल जाते हैं? बग्स की दुनिया में आपका स्वागत है।
\n\nविधि 1: CaseIterable — सरलता का राजा (लेकिन हमेशा गति का नहीं)
\n\nसबसे स्पष्ट और Apple द्वारा अनुशंसित तरीका आपके enum में CaseIterable जोड़ना है। Swift स्वचालित रूप से allCases प्रॉपर्टी उत्पन्न करेगा, जो सभी केसों का एक संग्रह लौटाएगा।
enum OrderStatus: String, CaseIterable {\n case pending = "Ожидание"\n case confirmed = "Подтверждён"\n case shipped = "Отправлен"\n case delivered = "Доставлен"\n case cancelled = "Отменён"\n}\n\n// उपयोग\nfor status in OrderStatus.allCases {\n print(status.rawValue) // "Ожидание", "Подтверждён"...\n}\n\nलाभ: सफ़ाई, नए केस जोड़ने पर स्वचालित समर्थन, पठनीयता।
\n\nनुकसान: प्रदर्शन। CaseIterable हर बार कॉल करने पर एक ऐरे उत्पन्न करता है। छोटे enum के लिए यह अदृश्य है, लेकिन यदि आपके पास 100+ तत्वों वाला enumeration है और आप लूप में allCases कॉल करते हैं (उदाहरण के लिए, 1000 सेल वाले tableView में), तो आपको ध्यान देने योग्य अंतराल मिलेगा। कंपाइलर परिणाम को कैश नहीं करता है — यह महत्वपूर्ण है।
बेंचमार्क: CaseIterable बनाम मैन्युअल ऐरे
\n\nआइए व्यवहार में इसकी जाँच करें। 50 केस वाला एक enum लें और एक्सेस समय मापें:
\n\nenum LargeEnum: String, CaseIterable {\n case a1, a2, a3 // ... और 47 केस\n}\n\n// प्रदर्शन परीक्षण (100,000 पुनरावृत्तियाँ)\nlet start = CFAbsoluteTimeGetCurrent()\nfor _ in 0..<100000 {\n let _ = LargeEnum.allCases\n}\nlet diff = CFAbsoluteTimeGetCurrent() - start\nprint("CaseIterable: \\(diff) सेकंड")\n\nपरिणाम (iPhone 14 सिम्युलेटर पर): ~0.45 सेकंड। और यदि हम ऐरे को मैन्युअल रूप से कैश करते हैं:
struct LargeEnumCache {\n static let allCases: [LargeEnum] = LargeEnum.allCases\n}\n\nlet start = CFAbsoluteTimeGetCurrent()\nfor _ in 0..<100000 {\n let _ = LargeEnumCache.allCases\n}\nprint("कैश किया गया: \\(diff) सेकंड") // ~0.02 सेकंड
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें