#ifdef Swift में: C/C++ से सशर्त संकलन को कैसे बदलें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

"आपके पास #ifdef कहाँ है?" — Swift में C डेवलपर का पहला प्रश्न

\n\n

यदि आप कभी C, C++ या Objective-C से Swift पर आए हैं, तो आपने निश्चित रूप से यह प्रश्न पूछा होगा: "यहाँ सशर्त संकलन कैसे करें? मेरा प्रिय #ifdef कहाँ है?" यह Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है — और यह उचित भी है। Swift की दुनिया में सामान्य अर्थों में कोई प्रीप्रोसेसर नहीं है, लेकिन इसका मतलब यह नहीं है कि आप विभिन्न प्लेटफार्मों, कॉन्फ़िगरेशन या डीबग मोड के लिए बिल्ड को लचीले ढंग से प्रबंधित नहीं कर सकते।

\n\n

इस लेख में, हम Swift में #ifdef को बदलने के सर्वोत्तम तरीकों पर चर्चा करेंगे: सरल निर्देशों से लेकर उन्नत बिल्ड स्कीम तक। आप सीखेंगे कि ऐसा कोड कैसे लिखें जो iOS और macOS दोनों पर काम करता है, रिलीज़ में डीबग जानकारी कैसे छिपाएँ, और प्लेटफ़ॉर्म फ़्लैग में कैसे भ्रमित न हों। चलिए शुरू करते हैं!

\n\n

Swift में #ifdef क्यों नहीं है (और यह अच्छा क्यों है)

\n\n

C प्रीप्रोसेसर एक शक्तिशाली लेकिन खतरनाक उपकरण है। यह कंपाइलर से पहले काम करता है, टाइप और स्कोप के बारे में नहीं जानता। परिणामस्वरूप, आसानी से #define मिल सकता है जो चारों ओर सब कुछ तोड़ देता है। Swift डेवलपर्स ने एक अलग रास्ता अपनाने का फैसला किया: उन्होंने सशर्त संकलन को सीधे भाषा में शामिल किया, जिससे यह सुरक्षित और अधिक पारदर्शी हो गया।

\n\n

#ifdef के बजाय, आप #if, #elseif, #else और #endif का उपयोग करते हैं — सिंटैक्स समान है, लेकिन यह प्रीप्रोसेसर के बजाय Swift कंपाइलर स्तर पर काम करता है। साथ ही, कुछ अंतर्निहित फ़्लैग जोड़े गए हैं, जिनके बारे में हम अब बात करेंगे।

\n\n

दृष्टिकोण 1: क्लासिक #if निर्देश — #ifdef का सबसे करीबी रिश्तेदार

\n\n

सबसे सीधा तरीका पूर्वनिर्धारित शर्तों के साथ #if का उपयोग करना है:

\n\n
#if DEBUG\n    print("यह डीबग बिल्ड है")\n    // यहाँ लॉगिंग, अतिरिक्त जाँच हो सकती है\n#else\n    print("यह रिलीज़ बिल्ड है")\n#endif
\n\n

यहाँ अंतर्निहित फ़्लैग की सूची है जिनका आप उपयोग कर सकते हैं:

\n\n
    \n
  • DEBUG — Debug कॉन्फ़िगरेशन के लिए स्वचालित रूप से परिभाषित (Xcode इसे स्वयं जोड़ता है)
  • \n
  • os(iOS), os(macOS), os(tvOS), os(watchOS) — प्लेटफ़ॉर्म जाँच
  • \n
  • arch(x86_64), arch(arm64), arch(i386), arch(arm) — प्रोसेसर आर्किटेक्चर
  • \n
  • swift(>=5.0) — Swift भाषा संस्करण
  • \n
  • canImport(UIKit) — मॉड्यूल उपलब्धता की जाँच
  • \n
  • targetEnvironment(simulator) — सिम्युलेटर पर काम करना
  • \n
\n\n

संयुक्त जाँच का उदाहरण:

\n\n
#if os(iOS) || os(tvOS)\n    import UIKit\n    typealias PlatformView = UIView\n#elseif os(macOS)\n    import AppKit\n    typealias PlatformView = NSView\n#else\n    typealias PlatformView = Any\n#endif
\n\n

यह कोड एक एकल उपनाम बनाता है जो विभिन्न प्लेटफार्मों पर काम करता है। क्रॉस-प्लेटफ़ॉर्म लाइब्रेरी के लिए बहुत सुविधाजनक!

\n\n

दृष्टिकोण 2: Active Compilation Conditions — आपका अपना #ifdef

\n\n

क्या होगा यदि आपको अपना स्वयं का फ़्लैग जोड़ने की आवश्यकता है जो मानक सेट में नहीं है? उदाहरण के लिए, BETA_FEATURES या PAYMENT_INTEGRATION। इसके लिए Xcode में Active Compilation Conditions (सक्रिय संकलन शर्तें) हैं।

\n\n

कैसे सेट करें:

\n
    \n
  1. Xcode में अपना प्रोजेक्ट खोलें
  2. \n
  3. target → Build Settings → Swift Compiler — Custom Flags चुनें
  4. \n
  5. Active Compilation Conditions फ़ील्ड खोजें
  6. \n
  7. अपने फ़्लैग को स्पेस से अलग करके जोड़ें, उदाहरण: BETA PAYMENT_V2
  8. \n
\n\n

कोड में इस प्रकार उपयोग करें:

\n\n
#if BETA\n    print("बीटा संस्करण चल रहा है")\n    showBetaUI()\n#endif\n\n#if PAYMENT_V2\n    let paymentProcessor = NewPaymentProcessor()\n#else\n    let paymentProcessor = LegacyPaymentProcessor()\n#endif
\n\n

यह C/C++ से #ifdef का सीधा प्रतिस्थापन है! आप स्वयं निर्णय लेते हैं

ब्लॉग

पुस्तक अनुशंसाएँ