প্রিপ্রোসেসর ম্যাক্রোগুলির অনুপস্থিতিতে এক্সকোড প্রকল্পের প্রকল্প স্তরে ব্যবহারিক প্রকল্পের নির্দিষ্ট পতাকা নির্দিষ্ট করার উপায় আছে কি?


174

সুইফ্টের আগে আমি আলফা, বিটা এবং বিতরণ বিল্ডগুলির জন্য স্কিমগুলির একটি সেট সংজ্ঞায়িত করব। এই প্রকল্পগুলির প্রত্যেকটিতে ম্যাক্রোগুলির একটি সেট থাকবে যা প্রকল্প স্তরে নির্দিষ্ট আচরণগুলি গেটে সংজ্ঞায়িত করা হয়েছিল। এর সহজ উদাহরণটি হল DEBUG = 1 ম্যাক্রো যা রান বিল্ডের জন্য ডিফল্ট স্কিমের সমস্ত এক্সকোড প্রকল্পের জন্য ডিফল্টরূপে সংজ্ঞায়িত হয়। কেউ #ifdef DEBUG কে কোয়েরি করতে পারে ... এবং কোডটি সেই অনুযায়ী সিদ্ধান্ত নিতে পারে, এমনকি অপ্রয়োজনীয় কোডও সংকলন করে।

দেখে মনে হচ্ছে এই ধরণের কনফিগারেশনাল গ্যাটিংটি সুইফ্ট ব্যবহার করা ততটা সহজ নয়, কারণ ম্যাক্রোগুলি সমর্থিত নয়। কেউ কি তুলনামূলক পদ্ধতির পরামর্শ দিতে পারে, সেপ্টেম্বর অনুসারে কোডটি সংকলিত হয় কিনা সেদিকে আমার খেয়াল নেই। যদিও বিল্ড স্কিমের উপর ভিত্তি করে বৈশিষ্ট্যগুলি গেট করতে চাই।

উত্তর:


468

অ্যাপল ডকস অনুসারে সুইফটে আপনি "# if / # অন্য / # এন্ডিফ" প্রিপ্রোসেসর ম্যাক্রোগুলি (যদিও আরও সীমাবদ্ধ) ব্যবহার করতে পারেন । এখানে একটি উদাহরণ:

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

এখন, আপনাকে অবশ্যই অন্য কোনও জায়গায় "DEBUG" চিহ্নটি সেট করতে হবে set এটি "সুইফ্ট সংকলক - কাস্টম পতাকা" বিভাগে, "অন্যান্য সুইফ্ট পতাকা" রেখায় সেট করুন। আপনি -D DEBUGএন্ট্রি সহ DEBUG প্রতীক যুক্ত করুন ।

(বিল্ড সেটিংস -> সুইফ্ট সংকলক - কাস্টম ফ্ল্যাগ) এখানে চিত্র বর্ণনা লিখুন

যথারীতি, আপনি যখন ডিবাগে থাকবেন বা কখন প্রকাশিত হবে তখন একটি আলাদা মান সেট করতে পারেন।

আমি এটি বাস্তব কোডে পরীক্ষা করেছি; এটি কোনও খেলার মাঠে স্বীকৃত বলে মনে হচ্ছে না।


5
মনে রাখবেন যে আপনি আরও পরীক্ষা যুক্ত করতে # সেলফ লাইন ব্যবহার করতে পারেন। আকর্ষণীয় যথেষ্ট, আপনি সংজ্ঞাটি অ্যাক্সেস করতে পারেন তবে এ থেকে কিছুই বের করতে পারবেন না; এটি, -DDEBUG = 5 (বা = "FOO") সংজ্ঞায়িত করুন এবং তারপরে এটি "মুদ্রণ" (DEBUG হয় (DEBUG)) দিয়ে মুদ্রণের চেষ্টা করুন That লাইনটি কোনও ত্রুটি তৈরি করে না, তবে কিছুই করে না
ডেভিড এইচ

10
দ্রষ্টব্য: "বিল্ট সেটিংস -> সুইফ্ট সংকলক -> কাস্টম পতাকা" "বেসিক" বিল্ড সেটিংসে দৃশ্যমান নয়। এটি উপস্থিত হওয়ার জন্য অবশ্যই "সমস্ত" বিল্ড সেটিংস প্রদর্শন করতে হবে।
লেবিবোস্টিয়ান

7
@ ইউজিনডুবিন সম্ভবত সম্ভবত আপনার নিশ্চিত হওয়া উচিত যে $(inherited)প্রকল্পের সেটিংস উত্তরাধিকারী করার জন্য লক্ষ্য সেটিংসে ব্যবহৃত হয়েছে।
ড্যানস্কিল

2
@ ডানস্কিলটি দুর্দান্ত $(inherited)মন্তব্য করে আমার মন্তব্যটিকে অপ্রাসঙ্গিক করে তোলে, আপনাকে ধন্যবাদ!
ইয়েভেন ডাবিনিন

10
এক্সকোড ৮-তে এখন "সুইফ্ট সংকলক - কাস্টম ফ্ল্যাগস" বিভাগে একটি "অ্যাক্টিভ সংকলন শর্তাদি" সেটিংস রয়েছে। আপনি এখানে ডি
মারকাস

32

আমরা সুইফ কম্পাইলার ফ্ল্যাগ সেট করতে না চাওয়া নিয়ে একটি ইস্যুতে ছড়িয়ে পড়েছি কারণ আমাদের সেগুলি সেট করতে এবং বিভিন্ন টার্গেট ইত্যাদির জন্য তাদের আপ টু ডেট রাখতে হবে না। এছাড়াও, আমাদের মিশ্র কোডবেজে আমরা স্মরণ রাখতে চাই না প্রতিটি ভাষার জন্য উপযুক্তভাবে আমাদের পতাকাগুলি সেট করতে set

আমাদের জন্য, আমরা ওবজিসিতে একটি ফাইল ঘোষণা করেছি

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")
}

এটি অবশ্যই একটি কর্মসংস্থান, তবে এটি আমাদের সমস্যার সমাধান করেছে তাই আমি এটি এখানে সহায়তা করে আশা করি যে এটি সাহায্য করবে। এটি বিদ্যমান উত্তরগুলি অবৈধ কিনা তা বোঝানোর উদ্দেশ্যে নয়।


11
ম্যাক্রোর পুরো পয়েন্টটি বিল্ড কনফিগারেশনের ভিত্তিতে কোড পরিবর্তন করা change আপনি যদি রানটাইমে ফিরে আসেন তবে এর জন্য আপনার ম্যাক্রোর দরকার নেই।
বেরিক

18
@ বারিক - আমি এই আশায় একটি বৈধ সমাধান পোস্ট করেছি যে এটি অন্যদেরও বিশেষত বহু-ভাষা প্রকল্পগুলিতে এই সমস্যার একটি দিক সমাধানের চেষ্টা করতে সহায়তা করতে পারে। আপনার সমস্যাটির জন্য যদি নির্দিষ্ট কোডটি সংকলন না করা হয় তবে তা ঠিক। এছাড়াও একটি মন্তব্য জরিমানা, বিশেষত যখন এটি তাদের শিক্ষিত করে কেন এটি তাদের জন্য সমাধান হতে পারে না। এছাড়াও এই পদ্ধতির সীমাবদ্ধতা সম্পর্কে উত্তরে একটি নোট তৈরি করতে বলছে। ডাউনভোটিং অপ্রয়োজনীয় এবং বিকল্প সমাধানগুলি নিরুৎসাহিত করে যা অন্যদের অনুরূপ সমস্যা সমাধানে সহায়ক হতে পারে। এছাড়াও, অপ বলেছে যে "কোডটি সংকলন করা হয়েছে কিনা সে সম্পর্কে আমি চিন্তা করি না" "
লোগান

5

লোগানস পদ্ধতির আরও তাত্ক্ষণিক সমাধান। সেট -D DEBUGমধ্যে Other Swift Flagsএর Swift Compiler - Custom Flagsআপনার টার্গেট এর বিল্ড সেটিংসে অধ্যায়।

তারপরে বৈশ্বিক সুযোগে নিম্নলিখিত পদ্ধতিটি ঘোষণা করুন:

#if DEBUG
let isDebugMode = true
#else
let isDebugMode = false
#endif

এখন হিসাবে এটি ব্যবহার করুন

if isDebugMode {
    // Do debug stuff
}

1

আমার জন্য, " সক্রিয় সংকলন শর্ত " এর ডিবাগ আইটেমটি "ডিইবিইউজি" তে কাজ করুন।

তারপরে #IF DEBUG এ DEBGU কী কাজটি ডিবাগ মোডে এবং #ELSE প্রকাশের মোডে কাজ করে:

  1. আপনার লক্ষ্য নির্বাচন করুন,
  2. "অ্যাক্টিভ সংকলন শর্ত" এর জন্য বিল্ড সেটিং ট্যাব অনুসন্ধানে,
  3. এর "ডিবাগ" আইটেমটির মান "আপনারকি ওয়ার্ড" এ সেট করুন,
  4. অনুসরণ হিসাবে কেবল ব্যবহার করুন:

    #if DEBUG
        print("You'r running in DEBUG mode!")
    #else
        print("You'r running in RELEASE mode!")
    #endif

0

আমি একটি মিশ্র ভাষার কোড বেসে কাজ করছি যেখানে কনজোলটিতে ডিবাগ বার্তা প্রেরণের জন্য আপত্তি-সি কোড একটি ম্যাক্রো ব্যবহার করে (এবং সেই ম্যাক্রো আমাদের ডিবাগ প্রিপ্রসেসরের পতাকাটিতে নির্ভর করে)। আমি সুইফট কোডে একই ম্যাক্রো কল করতে সক্ষম হতে চেয়েছিলাম ...

  1. আমি আমার ওজে-সি ক্লাসের একটিতে একটি শ্রেণির পদ্ধতি তৈরি করেছি যা সেই ম্যাক্রোর চারপাশে মোড়ক।
  2. আমি আমাদের ব্রিজ শিরোলেখ ফাইলটিতে এইজেক্ট-সি শিরোনাম যুক্ত করেছি।
  3. এখন আমার সুইফট কোড সেই শ্রেণীর পদ্ধতিটিকে "প্রক্সি" হিসাবে অবজেক্ট-সি ম্যাক্রো হিসাবে কল করে।

এটি মৃদু বিরক্তিকর যে আমি কেবল সুইফট কোডটিতে সরাসরি ম্যাক্রোটিকে কল করতে পারি না, তবে আমার ডিবাগ পতাকাটি চালু / বন্ধ করার বিষয়ে চিন্তা করার জন্য এখন কমপক্ষে প্রকল্পে আমার কেবল একটি জায়গা রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.