दिलचस्प पोस्ट
MySQL विदेशी कुंजी त्रुटि 1005 त्रुटि 150 जावास्क्रिप्ट एनीमेशन LINQ को इकाईयों को 'डबल पार्स (सिस्टम। स्ट्रिंग)' विधि की पहचान नहीं है, और इस पद्धति को किसी स्टोर अभिव्यक्ति में अनुवाद नहीं किया जा सकता है मैं अपने खुद के कोड में Google क्रोम 11 की अपलोड फ़ोल्डर सुविधा का उपयोग कैसे करूं? कर्सर। वर्तमान बनाम यह। कर्सर डी 3 बार ग्राफ़ उदाहरण स्थानीय रूप से काम नहीं कर रहा है MinGW जी ++ कंपाइलर द्वारा उत्पादित निष्पादन योग्य के आकार को कम कैसे करें? ओपनसीवी में एवीआई फ़ाइलें बनाना चेकस्टाइल कॉन्फ़िगरेशन से IntelliJ IDEA कोड प्रारूप MySQL में लॉकिंग के बिना चयन करने का कोई भी तरीका? एंड्रॉइड में टच की स्थिति कैसे प्राप्त करें? एक ऑन-स्क्रीन कुंजीपटल बनाएं अजगर में सबसे प्रभावी स्ट्रिंग कन्क्वैनेशन विधि क्या है? अर्रे # प्रत्येक बनाम अर्रे # नक्शा संकलन समय पर एक सी स्ट्रिंग की कंप्यूटिंग लंबाई। यह वास्तव में एक constexpr है?

स्विफ्ट भाषा में #ifdef प्रतिस्थापन

सी / सी ++ / ऑब्जेक्टिव-सी में आप कंपाइलर प्रीप्रोसेसरों का उपयोग कर मैक्रो को परिभाषित कर सकते हैं। इसके अलावा, आप कंपाइलर प्रीप्रोसेसरों के द्वारा कोड के कुछ भागों को शामिल / बाहर कर सकते हैं।

#ifdef DEBUG // Debug-only code #endif 

क्या स्विफ्ट में एक समान समाधान है?

Solutions Collecting From Web of "स्विफ्ट भाषा में #ifdef प्रतिस्थापन"

हां तुम यह कर सकते हो।

स्विफ्ट में आप ऐप्पल डॉक्स के अनुसार "# if / # else / # endif" प्रीप्रोसेसर मैक्रोज़ (हालांकि अधिक विवश) का उपयोग कर सकते हैं। यहां एक उदाहरण है:

 #if DEBUG let a = 2 #else let a = 3 #endif 

अब, आपको "DEBUG" चिह्न कहीं और सेट करना होगा, यद्यपि। इसे "स्विफ्ट कंपाइलर – कस्टम झंडे" अनुभाग में "अन्य स्विफ्ट फ्लैग" पंक्ति में सेट करें। आप -D DEBUG प्रविष्टि के साथ DEBUG प्रतीक जोड़ते हैं

हमेशा की तरह, जब आप डिबग में हों या रिलीज़ होने पर आप एक अलग मान सेट कर सकते हैं

मैंने इसे वास्तविक कोड में परीक्षण किया और यह काम करता है; यह एक खेल के मैदान में हालांकि मान्यता प्राप्त नहीं लगता है।

आप यहां मेरी मूल पोस्ट पढ़ सकते हैं।


महत्वपूर्ण नोट: -DDEBUG=1 काम नहीं करता है केवल -D DEBUG काम करता है संकलक एक ध्वज को एक विशिष्ट मूल्य के साथ अनदेखा कर रहा है।

जैसा कि एप्पल डॉक्स में कहा गया है

स्विफ्ट कंपाइलर में एक प्रीप्रोसेसर शामिल नहीं है इसके बजाय, यह एक ही कार्यक्षमता को पूरा करने के लिए संकलन-समय विशेषताओं, निर्माण कॉन्फ़िगरेशन, और भाषा सुविधाओं का लाभ लेता है। इस कारण से, स्विफ्ट में प्रीप्रोसेसर निर्देशों का आयात नहीं किया जाता है।

कस्टम बिल्ड कॉन्फ़िगरेशन का उपयोग करके मैंने जो चाहते थे उसे हासिल करने में कामयाब रहा है:

  1. अपने प्रोजेक्ट पर जाएं / अपना लक्ष्य चुनें / बिल्ट सेटिंग्स / कस्टम फ्लैग के लिए खोजें
  2. आपके चुने हुए लक्ष्य के लिए डीब उपसर्ग (बिना सफेद स्थान के) का उपयोग करके अपना कस्टम फ्लैग सेट करें, दोनों डीबग और रिलीज के लिए
  3. आपके पास हर लक्ष्य के लिए ऊपर दिए गए कदम हैं

यहां बताया गया है कि आप लक्ष्य की जांच कैसे करते हैं:

 #if BANANA print("We have a banana") #elseif MELONA print("Melona") #else print("Kiwi") #endif 

यहां छवि विवरण दर्ज करें

स्विफ्ट 2.2 का उपयोग करके परीक्षण किया गया

कई स्थितियों में, आपको वास्तव में सशर्त संकलन की ज़रूरत नहीं है; आपको सशर्त व्यवहार की आवश्यकता है, जिसे आप चालू और बंद कर सकते हैं। इसके लिए, आप एक पर्यावरण चर का उपयोग कर सकते हैं इसका बड़ा फायदा है कि आपको वास्तव में पुनः कंपाइल करने की ज़रूरत नहीं है

आप स्कीम एडिटर में, पर्यावरण चर सेट कर सकते हैं और आसानी से इसे चालू या बंद कर सकते हैं:

यहां छवि विवरण दर्ज करें

आप NSProcessInfo के साथ पर्यावरण चर को पुनः प्राप्त कर सकते हैं:

  let dic = NSProcessInfo.processInfo().environment if dic["TRIPLE"] != nil { // ... do secret stuff here ... } 

यहाँ एक वास्तविक जीवन उदाहरण है मेरा ऐप केवल डिवाइस पर चलता है, क्योंकि यह संगीत लाइब्रेरी का उपयोग करता है, जो सिम्युलेटर पर मौजूद नहीं है। तो, मैं अपने डिवाइस के लिए सिम्युलेटर पर स्क्रीन शॉट्स कैसे ले सकता हूं? उन स्क्रीन शॉट्स के बिना, मैं AppStore को सबमिट नहीं कर सकता।

मुझे नकली डेटा की आवश्यकता है और इसे प्रसंस्करण का एक अलग तरीका है । मेरे पास दो पर्यावरण चर हैं: एक है, जो चालू है, एप को मेरे डिवाइस पर चलते समय वास्तविक डेटा से नकली डेटा उत्पन्न करने के लिए कहता है; दूसरा जो, जब स्विच किया जाता है, सिम्युलेटर पर चलते समय नकली आंकड़ों का इस्तेमाल करता है (गायब संगीत लाइब्रेरी नहीं)। स्कीम एडिटर में इन विशेष मोडों को चालू / बंद करने से पर्यावरण चर चेकबॉक्स के लिए आसान धन्यवाद है। और बोनस यह है कि मैं अपने ऐप स्टोर बिल्ड में गलती से उनका उपयोग नहीं कर सकता, क्योंकि संग्रह में कोई पर्यावरण चर नहीं है

ifdef प्रतिस्थापन का एक बड़ा परिवर्तन Xcode 8 के साथ आया था। सक्रिय संकलन स्थितियों का उपयोग।

Xcode 8 रिलीज नोट में बिल्डिंग और लिंकिंग देखें

नई बिल्ड सेटिंग

नई सेटिंग: SWIFT_ACTIVE_COMPILATION_CONDITIONS

 “Active Compilation Conditions” is a new build setting for passing conditional compilation flags to the Swift compiler. 

पहले, हमें आपके सशर्त संकलन के झंडे को OTHER_SWIFT_FLAGS के तहत घोषित करना था, जो सेटिंग को "-डी" में शामिल करने के लिए याद रखना था उदाहरण के लिए, एक MYFLAG मान के साथ सशर्त रूप से संकलित करने के लिए:

 #if MYFLAG1 // stuff 1 #elseif MYFLAG2 // stuff 2 #else // stuff 3 #endif 

सेटिंग में जोड़ने के लिए -DMYFLAG

अब हमें केवल नए सेटिंग में मूल्य MYFLAG पास करना होगा। उन सशर्त संकलन मूल्यों को स्थानांतरित करने का समय!

कृपया Xcode 8 में अधिक स्विफ्ट बिल्ड सेटिंग फीचर के लिए नीचे दिए लिंक देखें: http://www.miqu.me/blog/2016/07/31/xcode-8-new-build-settings-and-analyzer-improvements/

स्विफ्ट 3.1 की तरह, यदि आपको केवल सभी की आवश्यकता है तो जांच कर लें कि कोड डीबग या रिलीज़ कॉन्फ़िगरेशन के साथ बनाया गया है, तो आप अंतर्निहित कार्य का उपयोग कर सकते हैं:

  • _isDebugAssertConfiguration() (जब अनुकूलन को -Onone सेट किया -Onone )
  • _isReleaseAssertConfiguration() (जब ऑप्टिमाइज़ेशन को -O सेट किया गया है) (स्विफ्ट 3+ पर उपलब्ध नहीं है)
  • _isFastAssertConfiguration() (जब ऑप्टिमाइज़ेशन को- -Ounchecked करने के लिए सेट किया -Ounchecked )

जैसे

 func obtain() -> AbstractThing { if _isDebugAssertConfiguration() { return DecoratedThingWithDebugInformation(Thing()) } else { return Thing() } } 

पूर्वप्रक्रमक मैक्रोज़ के मुकाबले,

  • ✓ आप इसे इस्तेमाल करने के लिए कस्टम -D DEBUG ध्वज को परिभाषित करने की आवश्यकता नहीं है
  • ~ यह वास्तव में अनुकूलन सेटिंग्स के संदर्भ में परिभाषित किया गया है, न कि Xcode बिल्ड कॉन्फ़िगरेशन
  • ✗ अनुपयुक्त, जिसका अर्थ है कि फ़ंक्शन को किसी भी अपडेट में हटाया जा सकता है (लेकिन यह ऐपस्टोर-सुरक्षित होना चाहिए क्योंकि अनुकूलक इन्हें स्थिरांक में बदल देगा)

    • इन्हें एक बार हटा दिया गया था , लेकिन @testable विशेषता के अभाव में जनता को वापस लाया , भाग्य अनिश्चितता स्विफ्ट 4.0 पर
  • ✗ में प्रयोग करना अगर / अन्य हमेशा "कभी भी निष्पादित नहीं" चेतावनी उत्पन्न करेगा

कोई स्विफ्ट प्रीप्रोसेसर नहीं है (एक बात के लिए, मनमाना कोड प्रतिस्थापन टूटता प्रकार- और स्मृति-सुरक्षा।)

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

उदाहरण के लिए:

 #if os(iOS) let color = UIColor.redColor() #else let color = NSColor.redColor() #endif 

Xcode 8 और ऊपर

बनाएँ सेटिंग / स्विफ्ट कंपाइलर में कस्टम संकलन स्थितियां सेट करें – कस्टम झंडे

  • स्विफ्ट कंपाइलर को सशर्त संकलन झंडे पास करने के लिए यह नई बिल्ड सेटिंग है।
  • इस तरह सरल झंडे जोड़ें: ALPHA , BETA आदि

तो इसे इस तरह से संकलन स्थितियों के साथ जांचें:

 #if ALPHA // #elseif BETA // #else // #endif 

युक्ति: आप #if !ALPHA आदि का भी उपयोग कर सकते हैं।

Xcode 8 के लिए मेरे दो सेंट:

क) -D उपसर्ग का उपयोग करके एक कस्टम ध्वज ठीक काम करता है, लेकिन …

ख) सरल उपयोग:

Xcode 8 में एक नया खंड है: "सक्रिय संकलन स्थितियां", पहले से ही दो पंक्तियों के साथ, डिबग और रिलीज़ के लिए

बस अपने- -D बिना परिभाषित जोड़ें

मेरी अवधारणा केनीटम के उत्तर पर बनाता है

दोनों की तुलना करते समय मुख्य लाभ यह है कि यह निजी या गैर-दस्तावेज तरीकों पर भरोसा नहीं करता है।

स्विफ्ट 4 में :

 let isDebug: Bool = { var isDebug = false // function with a side effect and Bool return value that we can pass into assert() func set(debug: Bool) -> Bool { isDebug = debug return isDebug } // assert: // "Condition is only evaluated in playgrounds and -Onone builds." // so isDebug is never changed to false in Release builds assert(set(debug: true)) return isDebug }() 

प्रीप्रोसेसर मैक्रोज़ और केनीटम के जवाब की तुलना में,

  • ✓ आप इसे इस्तेमाल करने के लिए कस्टम -D DEBUG ध्वज को परिभाषित करने की आवश्यकता नहीं है
  • ~ यह वास्तव में अनुकूलन सेटिंग्स के संदर्भ में परिभाषित किया गया है, न कि Xcode बिल्ड कॉन्फ़िगरेशन
  • प्रलेखित , जिसका मतलब है कि समारोह सामान्य एपीआई रिहाई / बहिष्कार पैटर्न का पालन करेगा।

  • ✓ में प्रयोग अगर / अन्य में "कभी भी निष्पादित नहीं" चेतावनी उत्पन्न होगी