[Ios] प्रीप्रोसेसर मैक्रोज़ की अनुपस्थिति में, एक्सकोड प्रोजेक्ट में प्रोजेक्ट लेवल पर व्यावहारिक योजना विशिष्ट झंडे को परिभाषित करने का कोई तरीका है


Answers

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

हमारे लिए, हमने ओबीजेसी में एक फाइल घोषित की

PreProcessorMacros.h

extern BOOL const DEBUG_BUILD;

उनमे

PreProcessorMacros.m

#ifdef DEBUG
    BOOL const DEBUG_BUILD = YES;
#else
    BOOL const DEBUG_BUILD = NO;
#endif

फिर, आपके उद्देश्य-सी ब्रिजिंग हेडर में

#import "PreProcessorMacros.h"

अब, इसे अपने स्विफ्ट कोडबेस में उपयोग करें

if DEBUG_BUILD {
    println("debug")
} else {
    println("release")
}

यह निश्चित रूप से एक कामकाज है, लेकिन यह हमारी समस्या का समाधान करता है इसलिए मैंने इसे आशाओं में यहां पोस्ट किया कि इससे मदद मिलेगी। यह सुझाव देने के लिए नहीं है कि मौजूदा उत्तर अमान्य हैं।

Question

तेजी से पहले मैं अल्फा, बीटा, और वितरण निर्माण के लिए योजनाओं का एक सेट परिभाषित करता हूं। इन योजनाओं में से प्रत्येक में मैक्रोज़ का एक सेट होगा जिसे परियोजना स्तर पर गेट कुछ व्यवहारों के लिए परिभाषित किया गया था। सबसे सरल उदाहरण DEBUG = 1 मैक्रो है जिसे रन बिल्ड के लिए डिफ़ॉल्ट योजना में सभी एक्सकोड परियोजनाओं के लिए डिफ़ॉल्ट रूप से परिभाषित किया गया है। कोई #ifdef DEBUG से पूछताछ कर सकता है ... और कोड के अनुसार निर्णय ले सकता है, यहां तक ​​कि गैर आवश्यक कोड को संकलित भी कर सकता है।

ऐसा लगता है कि इस प्रकार की कॉन्फ़िगरेशन गेटिंग स्विफ्ट का उपयोग करना उतना आसान नहीं है, क्योंकि मैक्रोज़ समर्थित नहीं हैं। क्या कोई तुलनीय दृष्टिकोण सुझा सकता है, मुझे परवाह नहीं है कि कोड संकलित किया गया है, प्रति से। हालांकि, निर्माण योजना के आधार पर मैं गेट फीचर्स लेना चाहता हूं।




मैं मिश्रित भाषा कोड बेस में काम कर रहा हूं जहां ओबीजे-सी कोड कंसोल पर डीबग संदेश भेजने के लिए मैक्रो का उपयोग करता है (और यह मैक्रो हमारे डीबग प्रीप्रोसेसर ध्वज पर निर्भर करता है)। मैं तेज़ कोड में उसी मैक्रो को कॉल करने में सक्षम होना चाहता था ...

  1. मैंने अपने ओबीजे-सी कक्षाओं में से एक पर एक क्लास विधि बनाई जो उस मैक्रो के चारों ओर एक रैपर है।
  2. मैंने कहा कि हमारे पुल हेडर फ़ाइल में obj-c हेडर।
  3. अब मेरा स्विफ्ट कोड क्लास विधि को obj-c मैक्रो में "प्रॉक्सी" के रूप में कॉल करता है।

यह हल्के से कष्टप्रद है कि मैं सिर्फ तेज कोड में सीधे मैक्रो को कॉल नहीं कर सकता, लेकिन कम से कम अब मेरे पास इस डीबग फ्लैग को चालू / बंद करने के बारे में चिंता करने के लिए प्रोजेक्ट में केवल एक स्थान है।