সুইফ ভাষায় #ifdef প্রতিস্থাপন


735

সি / সি ++ / অবজেক্টিভ সিতে আপনি সংকলক প্রিপ্রসেসরগুলি ব্যবহার করে কোনও ম্যাক্রো সংজ্ঞায়িত করতে পারেন। তদুপরি, আপনি সংকলক প্রিপ্রসেসরগুলি ব্যবহার করে কোডের কিছু অংশ অন্তর্ভুক্ত / বাদ দিতে পারেন।

#ifdef DEBUG
    // Debug-only code
#endif

সুইফটে কি তেমন সমাধান রয়েছে?


1
একটি ধারণা হিসাবে, আপনি এটি আপনার আপত্তি-সি ব্রিজিং হেডারগুলিতে রাখতে পারেন ..
মতেজ

42
আপনার বেছে নেওয়া বেশ কয়েকটি আছে বলে আপনার সত্যিকার অর্থে একটি উত্তর দেওয়া উচিত এবং এই প্রশ্নটি আপনাকে প্রচুর ভোট পেয়েছে।
ডেভিড এইচ

উত্তর:


1069

হ্যাঁ, আপনি এটা করতে পারেন.

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

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

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

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

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

আপনি আমার মূল পোস্টটি এখানে পড়তে পারেন ।


গুরুত্বপূর্ণ দ্রষ্টব্য: -DDEBUG=1 কাজ করে না। শুধু -D DEBUGকাজ করে। মনে হচ্ছে সংকলক একটি নির্দিষ্ট মান সহ একটি পতাকা উপেক্ষা করছে।


41
এটি সঠিক উত্তর, যদিও এটি লক্ষ করা উচিত যে আপনি কেবল পতাকাটির উপস্থিতি যাচাই করতে পারেন তবে নির্দিষ্ট মান নয়।
চার্লস হারলে

19
অতিরিক্ত টীকা : যোগ উপরে -D DEBUGউপরে বর্ণিত, এছাড়াও আপনি নির্ধারণ করতে প্রয়োজন DEBUG=1মধ্যে Apple LLVM 6.0 - Preprocessing-> Preprocessor Macros
ম্যাথু কুইরোস

38
আমি -DDEBUGএই উত্তরটি থেকে ফর্ম্যাটিংটি পরিবর্তন না করা পর্যন্ত আমি এটি কাজ করতে পারি না : stackoverflow.com/a/24112024/747369
ক্র্যামার

11
@ ম্যাটকুইরোস এটিকে যুক্ত DEBUG=1করার দরকার নেই Preprocessor Macros, যদি আপনি এটি উদ্দেশ্য-সি কোড ব্যবহার করতে না চান।
derpoliuk

7
@ ড্যানিয়েল আপনি স্ট্যান্ডার্ড বুলিয়ান অপারেটরগুলি ব্যবহার করতে পারেন (উদা: `# আইফ! ডিবগ`)
জিন লে মাইগানান

353

যেমন অ্যাপল ডক্সে বলা হয়েছে

সুইফ্ট সংকলকটিতে প্রিপ্রসেসর অন্তর্ভুক্ত নেই। পরিবর্তে, এটি একই কার্যকারিতাটি সম্পাদন করতে সংকলন-সময় বৈশিষ্ট্যগুলি তৈরির কনফিগারেশন এবং ভাষার বৈশিষ্ট্যগুলির সুবিধা গ্রহণ করে। এই কারণে, প্রিপ্রসেসর নির্দেশাবলী সুইফটে আমদানি করা হয় না।

আমি কাস্টম বিল্ড কনফিগারেশন ব্যবহার করে যা চেয়েছিলাম তা অর্জন করতে সক্ষম হয়েছি:

  1. আপনার প্রকল্পে যান / আপনার লক্ষ্য নির্বাচন করুন / সেটিংস তৈরি করুন / কাস্টম ফ্ল্যাগগুলি অনুসন্ধান করুন
  2. আপনার নির্বাচিত টার্গেটের জন্য ডিবাগ এবং রিলিজ উভয়ের জন্য -D উপসর্গ (সাদা স্পেস ছাড়াই) ব্যবহার করে আপনার কাস্টম পতাকা সেট করুন
  3. আপনার প্রতিটি লক্ষ্যর জন্য উপরের পদক্ষেপগুলি করুন

আপনি কীভাবে লক্ষ্যবস্তুটি পরীক্ষা করেন তা এখানে:

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

এখানে চিত্র বর্ণনা লিখুন

সুইফট ২.২ ব্যবহার করে পরীক্ষা করা হয়েছে


4
১. সাদা স্থানের কাজ সহ, ২. কেবলমাত্র ডিবাগের জন্য পতাকা সেট করা উচিত?
c0ming

3
@ c0ming এটি আপনার প্রয়োজনের উপর নির্ভর করে তবে আপনি যদি কেবল ডিবাগ মোডে কিছু ঘটতে চান এবং মুক্তি না দিয়ে আপনার রিলিজ থেকে -DDEBUG অপসারণ করতে হবে।
cdf1982

1
আমি কাস্টম পতাকা সেট করার পরে -DLOCAL, আমার উপর #if LOCAl #else #endif, এটি #elseবিভাগে পড়ে । আমি আসল লক্ষ্যটিকে সদৃশ করেছি AppTargetএবং AppTargetLocalএর কাস্টম পতাকা সেট করে সেট করে নামকরণ করেছি ।
পারওয়াইল লিউ

3
@ আন্দ্রেজ কীভাবে এক্সসিটিস্টকে কীভাবে কাস্টম ফ্ল্যাগগুলি সনাক্ত করতে হয় তা জানার জন্য আপনি কি ঘটতে পেরেছেন? আমি বুঝতে পারি যে এটি #if LOCAL সিম্যুলেটারের সাথে দৌড়ানোর #else সময় এবং পরীক্ষার সময় পড়ার সময় উদ্দেশ্যযুক্ত ফলাফল । আমি চাই এটি #if LOCALপরীক্ষার সময়ও পড়ে যায় ।
পারওয়াইল লিউ

3
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। বর্তমান স্বীকৃত উত্তরটি সুইফটের জন্য ভুল কারণ এটি কেবলমাত্র উদ্দেশ্য-সি প্রযোজ্য।
miken.mkndev

171

অনেক পরিস্থিতিতে আপনার সত্যিকার অর্থে শর্তসাপেক্ষ সংকলনের প্রয়োজন নেই ; আপনার কেবল শর্তযুক্ত আচরণ দরকার যা আপনি চালু এবং বন্ধ করতে পারেন। তার জন্য, আপনি একটি পরিবেশের পরিবর্তনশীল ব্যবহার করতে পারেন। এটির বিশাল সুবিধা যা আপনার আসলে পুনরায় সংকলন করতে হবে না।

আপনি পরিবেশ পরিবর্তনশীল সেট করতে পারেন এবং সহজেই স্কিম এডিটরটিতে এটি চালু বা বন্ধ করতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

এনএসপি প্রসেসআইএনফো দিয়ে আপনি পরিবেশের পরিবর্তনশীলটি পুনরুদ্ধার করতে পারেন:

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

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

আমার জাল ডেটা এবং এটি প্রক্রিয়া করার একটি ভিন্ন উপায় দরকার । আমার দুটি পরিবেশের ভেরিয়েবল রয়েছে: একটি, যা যখন অন হয়, তখন অ্যাপটিকে আমার ডিভাইসে চলার সময় আসল ডেটা থেকে জাল তথ্য তৈরি করতে বলে; অন্যটি যখন স্যুইচ করা থাকে তখন সিমুলেটারে চলার সময় ভুয়া তথ্য (নিখোঁজ সংগীত লাইব্রেরি নয়) ব্যবহার করে। সেই বিশেষ মোডগুলির প্রত্যেকটি অন / অফ স্যুইচ করা সম্পাদকীয় পরিবেশগত পরিবর্তনশীল চেকবক্সগুলিকে ধন্যবাদ is এবং বোনাসটি হ'ল আমি দুর্ঘটনাক্রমে এগুলি আমার অ্যাপ স্টোর বিল্ডে ব্যবহার করতে পারি না, কারণ সংরক্ষণাগারটির কোনও পরিবেশের ভেরিয়েবল নেই।


কোনও কারণে আমার পরিবেশের পরিবর্তনশীলটি দ্বিতীয় অ্যাপ্লিকেশন লঞ্চের সময় শূন্য হয়ে ফিরেছিল
ইউজিন

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

5
@ এরিক সম্মত হয়েছে, তবে তারা সমস্ত স্কিম কর্মের জন্য সেট করা নেই not সুতরাং আপনি বিল্ড-এন্ড-রান এবং আর্কাইভে একটি আলাদা জিনিস করতে পারেন যা প্রায়শই বাস্তব জীবনের পার্থক্য যা আপনি আঁকতে চান। অথবা আপনার একাধিক স্কিম থাকতে পারে যা বাস্তব জীবনের সাধারণ প্যাটার্নও। এছাড়াও, আমি আমার উত্তরে যেমন বলেছি, কোনও স্কিমের মধ্যে পরিবেশের ভেরিয়েবলগুলি চালু এবং বন্ধ করা সহজ।
ম্যাট

10
পরিবেশের ভেরিয়েবলগুলি সংরক্ষণাগার মোডে কাজ করে না। এক্সকোড থেকে অ্যাপটি চালু করা হলে এগুলি কেবল প্রয়োগ করা হয়। আপনি যদি কোনও ডিভাইসে এগুলি অ্যাক্সেস করার চেষ্টা করেন তবে অ্যাপটি ক্রাশ হবে sh কঠিন উপায় খুঁজে পেয়েছি।
iupchris10

2
@ iupchris10 "আর্কাইভের কোনও পরিবেশের ভেরিয়েবল নেই" উপরে আমার উত্তরের শেষ শব্দ। এটি, আমি আমার উত্তরে যেমন বলেছি, ভাল । এটা বিষয়
ম্যাট 21

159

ifdefপ্রতিস্থাপনের একটি বড় পরিবর্তন এসেছে এক্সকোড ৮ এর সাথে, অর্থাৎ অ্যাক্টিভ সংকলন শর্তাদি ব্যবহার করে ।

পড়ুন বিল্ডিং এবং লিঙ্কXcode 8 রিলিজ নোট

নতুন বিল্ড সেটিংস

নতুন সেটিং: SWIFT_ACTIVE_COMPILATION_CONDITIONS

Active Compilation Conditionsis a new build setting for passing conditional compilation flags to the Swift compiler.

পূর্বে, সেটিংসে "-D" প্রিপেন্ড করা স্মরণ করে আমাদের OTHER_SWIFT_FLAGS এর অধীনে আপনার শর্তসাপেক্ষ সংকলন পতাকাগুলি ঘোষণা করতে হয়েছিল। উদাহরণস্বরূপ, শর্তসাপেক্ষে একটি এমওয়াইফ্লাগ মান দিয়ে সংকলন করতে:

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

সেটিংসে যোগ করার মান -DMYFLAG

এখন আমাদের কেবলমাত্র MYFLAG মানটি নতুন সেটিংয়ে পাস করতে হবে। এই সমস্ত শর্তসাপেক্ষ সংকলনের মান সরিয়ে নেওয়ার সময়!

এক্সকোড 8-এ আরও সুইফ্ট বিল্ড সেটিংস বৈশিষ্ট্যটির জন্য দয়া করে নীচের লিঙ্কটি দেখুন: http://www.miqu.me/blog/2016/07/31/xcode-8-new-build-settings-and-analyzer-improvements/


বিল্ড টাইমে কোনও সেট অ্যাক্টিভ সংকলন শর্তগুলি অক্ষম করার জন্য কি আছে? পরীক্ষার জন্য ডিবাগ কনফিগারেশনটি তৈরি করার সময় আমাকে DEBUG শর্তটি অক্ষম করতে হবে।
জনি

1
@ জনি একমাত্র উপায় আমি খুঁজে পেয়েছি প্রকল্পের জন্য 3 য় বিল্ড কনফিগারেশন তৈরি করা। প্রকল্প> তথ্য ট্যাব> কনফিগারেশন থেকে '+' চাপুন, তারপরে ডিবেগকে নকল করুন। তারপরে আপনি এই কনফিগারেশনের জন্য সক্রিয় সংকলন শর্তগুলি কাস্টমাইজ করতে পারেন। নতুন বিল্ড কনফিগারেশনটি ব্যবহার করতে আপনার টার্গেট> টেস্ট স্কিমগুলি সম্পাদনা করতে ভুলবেন না!
ম্যাথিয়াস

1
এটি সঠিক উত্তর হওয়া উচিত..এই একমাত্র জিনিসটি যা আমার জন্য এক্সকোড 9 তে সুইফট 4.x ব্যবহার করে কাজ করেছিল!
শোকাভেলি

1
বিটিডাব্লু, এক্সকোড 9.3-তে সুইফট 4.1 ডিইবিইউ ইতিমধ্যে অ্যাক্টিভ সংকলন শর্তে রয়েছে এবং আপনাকে ডিইবিইউজি কনফিগারেশন পরীক্ষা করার জন্য কিছু যুক্ত করতে হবে না। সবে #if DEBUG এবং #endif।
ডেনিস কুতলুবায়েভ

আমি মনে করি এটি উভয় অফ-বিষয়, এবং করা খারাপ কাজ। আপনি সক্রিয় সংকলন শর্তগুলি অক্ষম করতে চান না। পরীক্ষার জন্য আপনার একটি নতুন এবং পৃথক কনফিগারেশন দরকার - এতে "ডিবাগ" ট্যাগ থাকবে না। স্কিম সম্পর্কে জানুন।
মোটি শ্নের

93

সুইফট ৪.১ অনুসারে, আপনার কেবলমাত্র কোডটি ডিবাগ বা রিলিজ কনফিগারেশনের মাধ্যমে নির্মিত কিনা তা পরীক্ষা করে দেখুন, আপনি বিল্ট-ইন ফাংশনগুলি ব্যবহার করতে পারেন:

  • _isDebugAssertConfiguration()(যখন অপ্টিমাইজেশন সেট করা থাকে সত্য -Onone)
  • _isReleaseAssertConfiguration()(যখন অপ্টিমাইজেশন সেট করা থাকে সত্য -O) (সুইফট 3+ এ উপলব্ধ নয়)
  • _isFastAssertConfiguration()(যখন অপ্টিমাইজেশন সেট করা থাকে সত্য -Ounchecked)

যেমন

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

প্রিপ্রোসেসর ম্যাক্রোগুলির সাথে তুলনা করা,

  • A -D DEBUGএটির জন্য আপনার কোনও কাস্টম পতাকা সংজ্ঞায়িত করার দরকার নেই
  • Actually এটি আসলে এক্সকোড বিল্ড কনফিগারেশন নয়, অপটিমাইজেশন সেটিংসের ক্ষেত্রে সংজ্ঞায়িত
  • Oc Undocumented, যার অর্থ ফাংশনটি কোনও আপডেটে মুছে ফেলা যায় (তবে এটি অ্যাপস্টোর-সেফ হওয়া উচিত যেহেতু অপ্টিমাইজার এগুলি স্থির করে দেবে)

  • / / অন্যথায় ব্যবহার করা সর্বদা একটি "কখনই কার্যকর হবে না" সতর্কতা তৈরি করে।


1
এই বিল্ট-ইন ফাংশনগুলি সংকলন সময় বা রানটাইম সময়ে মূল্যায়ন করা হয়?
ma11hew28

@ ম্যাটডিপিপাস্কোলে অপ্টিমাইজেশনের সময়। রিলিজ মোডে if _isDebugAssertConfiguration()মূল্যায়ন করা হবে if falseএবং if trueএটি ডিবাগ মোড।
কেনেটিএম

2
যদিও মুক্তির ক্ষেত্রে কিছু ডিবাগ-কেবল পরিবর্তনশীল অনির্বাচন করতে আমি এই ফাংশনগুলি ব্যবহার করতে পারি না।
ফ্রাঙ্কলিন ইউ

3
এই ফাংশনগুলি কোথাও নথিভুক্ত করা হয়?
টম হ্যারিংটন

7
সুইফট 3.0 এবং এক্সকোড 8 হিসাবে, এই ফাংশনগুলি অবৈধ।
কোডবেডার

86

এক্সকোড 8 এবং তারপরে

বিল্ড সেটিংস / সুইফ্ট সংকলকটিতে সক্রিয় সংকলনের শর্তাদি সেটিংটি ব্যবহার করুন - কাস্টম পতাকাগুলি

  • এটি সুইফট সংকলকটিতে শর্তসাপেক্ষ সংকলন পতাকাগুলি পাস করার জন্য নতুন বিল্ড সেটিং।
  • এত সাধারণ অ্যাড পতাকা: ALPHA, BETAইত্যাদি

তারপরে এটি সংকলন শর্তগুলির সাথে এটি পরীক্ষা করুন :

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

পরামর্শ: আপনি #if !ALPHAইত্যাদি ব্যবহার করতে পারেন


77

কোনও সুইফ্ট প্রিপ্রেসেসর নেই। (একটি জিনিসের জন্য, স্বেচ্ছাসেবীর কোড বিকল্পটি ভেঙে দেয় টাইপ- এবং মেমরি-সুরক্ষা))

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

উদাহরণ স্বরূপ:

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

34
"একটি জিনিসের জন্য, স্বেচ্ছাসেবীর কোড বিকল্পটি টাইপ- এবং মেমরি-সুরক্ষা ভেঙে দেয়।" সংকলক তৈরি করার আগে কোনও প্রাক-প্রসেসর কাজ করে না (তাই নামটি দেয়)? সুতরাং এই সমস্ত চেক এখনও লাগতে পারে।
থিলো

10
@ তিলো আমি ভাবি যা ভেঙে যায় তা আইডিই সমর্থন
আলেকসান্দ্র ডাবিনস্কি

1
আমি মনে করি @ ই্রিকাস্টার যা পেয়েছে তা হ'ল সি প্রিপ্রোসেসর ম্যাক্রোগুলির টাইপ সম্পর্কে কোনও ধারণা নেই এবং তাদের উপস্থিতিটি সুইফটের ধরণের প্রয়োজনীয়তা ভঙ্গ করবে। সি-তে ম্যাক্রোগুলি কাজ করার কারণ হ'ল সি অন্তর্নিহিত ধরণের রূপান্তরকে মঞ্জুরি দেয়, যার অর্থ আপনি নিজের INT_CONSTযে কোনও জায়গায় রেখে floatদিতে পারেন এটি গ্রহণযোগ্য হবে। সুইফ্ট এটি অনুমতি দেয় না। এছাড়াও, আপনি যদি var floatVal = INT_CONSTঅনিবার্যভাবে এটি করতে পারতেন তবে এটি কোথাও পরে ব্রেকডাউন হবে যখন সংকলকটি আশা করে Intতবে আপনি এটি হিসাবে ব্যবহার করেন Float(প্রকার floatValহিসাবে অনুমান করা হবে Int)। পরে 10 টি ক্যাসেট এবং ম্যাক্রোগুলি অপসারণ করার জন্য এর একমাত্র ক্লিনার ...
এফেমেরা

আমি এটি ব্যবহার করার চেষ্টা করছি তবে এটি কাজ করছে বলে মনে হচ্ছে না, এটি এখনও iOS বিল্ডগুলিতে ম্যাক কোডটি সংকলন করছে। কোথাও কি আর কোনও সেটআপ স্ক্রিন আছে যা টুইট করতে হবে?
মৌরি মার্কোভিটস

1
@ তিলো আপনি সঠিক - একটি প্রি-প্রসেসর কোনও প্রকার বা মেমরির সুরক্ষা ভঙ্গ করে না।
tcurdt

50

এক্সকোড 8 এর জন্য আমার দুটি সেন্ট:

ক) -Dউপসর্গ ব্যবহার করে একটি কাস্টম পতাকা ঠিকঠাক কাজ করে, তবে ...

খ) সহজ ব্যবহার:

এক্সকোড 8 এ একটি নতুন বিভাগ রয়েছে: "সক্রিয় সংকলন শর্তগুলি", ইতিমধ্যে দুটি সারি দিয়ে ডিবাগ এবং প্রকাশের জন্য।

কেবলমাত্র আপনার সংজ্ঞা ব্যতীত যুক্ত করুন -D


দেবাগ এবং রিলিজের জন্য দুটি সারি রয়েছে উল্লেখ করার জন্য ধন্যবাদ
ইয়েজচাক

কেউ কি মুক্তির জন্য এই পরীক্ষা করেছে?
গ্লেন

এটি দ্রুত ব্যবহারকারীদের জন্য আপডেট করা উত্তর। ছাড়া অর্থাৎ -D
মণি

46

সক্রিয় সংকলনের শর্তগুলির উপর ভিত্তি করে isDebug কনস্ট্যান্ট

আর একটি, সম্ভবত সহজ, সমাধান যা এখনও আপনার বুলিয়ানটির ফলাফল দেয় যা আপনি #ifআপনার কোডবেজ জুড়ে শর্ত ছাড়াই ফাংশনগুলিতে যেতে পারেন DEBUGযা আপনার প্রকল্পের বিল্ড টার্গেটের Active Compilation Conditionsএকটি হিসাবে সংজ্ঞায়িত করা এবং নিম্নলিখিতগুলি অন্তর্ভুক্ত করা হয় (আমি এটি একটি বিশ্ব ধ্রুবক হিসাবে সংজ্ঞায়িত করছি):

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

কম্পাইলার অপটিমাইজেশন সেটিংসের উপর ভিত্তি করে isDebug কনস্ট্যান্ট

এই ধারণাটি কেনেটিমের উত্তর নিয়ে তৈরি করে

কেনেটিমের সাথে তুলনা করার সময় প্রধান সুবিধাটি হ'ল এটি ব্যক্তিগত বা অননুমোদিত পদ্ধতিগুলির উপর নির্ভর করে না।

ইন সুইফট 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 true in Release builds
    assert(set(debug: true))
    return isDebug
}()

প্রিপ্রোসেসর ম্যাক্রো এবং কেনেটিমের উত্তরের সাথে তুলনা করে ,

  • A -D DEBUGএটির জন্য আপনার কোনও কাস্টম পতাকা সংজ্ঞায়িত করার দরকার নেই
  • Actually এটি আসলে এক্সকোড বিল্ড কনফিগারেশন নয়, অপটিমাইজেশন সেটিংসের ক্ষেত্রে সংজ্ঞায়িত
  • U ডকুমেন্টেড , যার অর্থ ফাংশনটি সাধারণ এপিআই রিলিজ / অবমূল্যায়ন নিদর্শন অনুসরণ করবে।

  • / / অন্যথায় ব্যবহার করে "কখনই কার্যকর হবে না" সতর্কতা উত্পন্ন হবে না


25

মাইগানানস উত্তর এখানে ভাল কাজ করে। এখানে সহায়তা করার ক্ষেত্রে তথ্যের আরেকটি শান্তি দেওয়া হয়েছে,

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

আপনি নীচের মত ম্যাক্রোগুলিকে অস্বীকার করতে পারেন,

#if !RELEASE
    let a = 2
#else
    let a = 3
#endif

23

এক্সকোড সংস্করণ 9.4.1, সুইফট 4.1 দিয়ে তৈরি সুইফ্ট প্রকল্পগুলিতে

#if DEBUG
#endif

ডিফল্ট হিসাবে কাজ করে কারণ প্রিপ্রসেসর ম্যাক্রোস DEBUG = 1 এ ইতিমধ্যে এক্সকোড দ্বারা সেট করা হয়েছে।

সুতরাং আপনি #if DEBUG "বাক্সের বাইরে" ব্যবহার করতে পারেন।

যাইহোক, কন্ডিশন সংকলন ব্লকগুলি কীভাবে সাধারণভাবে ব্যবহার করতে হয় অ্যাপল এর বই দ্য সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ ৪.১ (বিভাগ সংকলক নিয়ন্ত্রণ বিবরণী) এবং কীভাবে সংকলিত পতাকাগুলি লিখতে হয় এবং সুইফটে সি ম্যাক্রোগুলির কী অংশটি লেখা হয় তাতে লেখা আছে আরেকটি অ্যাপলের বই সুইফট উইথ কোকো এবং অবজেক্টিভ সি ব্যবহার করে (প্রিপ্রেসেসর নির্দেশিকা বিভাগে)

আশা করি ভবিষ্যতে অ্যাপল তাদের বইয়ের জন্য আরও বিস্তারিত বিষয়বস্তু এবং সূচী লিখবে।



7

DEBUG=1আপনার GCC_PREPROCESSOR_DEFINITIONSবিল্ড সেটিংসে সেট করার পরে আমি এই কলগুলি করতে কোনও ফাংশন ব্যবহার পছন্দ করি:

func executeInProduction(_ block: () -> Void)
{
    #if !DEBUG
        block()
    #endif
}

এবং তারপরে এই ফাংশনটি যুক্ত করুন যে কোনও ব্লক যা আমি ডিবাগ বিল্ডে বাদ দিতে চাই:

executeInProduction {
    Fabric.with([Crashlytics.self]) // Compiler checks this line even in Debug
}

তুলনায় যখন সুবিধা:

#if !DEBUG
    Fabric.with([Crashlytics.self]) // This is not checked, may not compile in non-Debug builds
#endif

এটি কি সংকলকটি আমার কোডের বাক্য গঠনটি পরীক্ষা করে, তাই আমি নিশ্চিত যে এর বাক্য গঠনটি সঠিক এবং বিল্ড।


3

আপনি এখানে আঘাত করেছেন! প্রিফ্রোসেসর ম্যাক্রো নয় কাস্টম ফ্ল্যাগগুলির দিকে সুইফট # আইফ দেখায়। দয়া করে লিঙ্কটি থেকে সামগ্রীটির সাথে আপনার উত্তর আপডেট করুন, প্রায়শই লিঙ্কগুলি কিছু সময়ের পরে ভেঙে যায়
ডেল

2
func inDebugBuilds(_ code: () -> Void) {
    assert({ code(); return true }())
}

সূত্র


1
এটি শর্তসাপেক্ষ সংকলন নয়। দরকারী হিসাবে, এটি কেবল একটি সরল পুরানো রানটাইম শর্তসাপেক্ষ। ওপি metaprogramming উদ্দেশ্যে compiletime পর জিজ্ঞাসা করা হয়
Shayne

3
কেবল @inlinableসামনের দিকে যুক্ত করুন funcএবং এটি সুইফটের জন্য সর্বাধিক মার্জিত এবং মূর্তিমান উপায়। রিলিজে বিল্ডগুলি আপনার code()ব্লকটি অনুকূলিত এবং সম্পূর্ণরূপে নির্মূল করা হবে। অ্যাপলের নিজস্ব এনআইও কাঠামোর ক্ষেত্রে অনুরূপ একটি ফাংশন ব্যবহৃত হয়।
মোজুবা

1

এটি জোন উইলিসের উত্তরের উপর ভিত্তি করে যা দৃ as়তার উপর নির্ভর করে, যা কেবলমাত্র ডিবাগ সংকলনে সম্পাদিত হয়:

func Log(_ str: String) { 
    assert(DebugLog(str)) 
}
func DebugLog(_ str: String) -> Bool { 
    print(str) 
    return true
}

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

let iterations = 100_000_000
let time1 = CFAbsoluteTimeGetCurrent()
for i in 0 ..< iterations {
    Log ("⧉ unarchiveArray:\(fileName) memoryTime:\(memoryTime) count:\(array.count)")
}
var time2 = CFAbsoluteTimeGetCurrent()
print ("Log: \(time2-time1)" )

কপি করে প্রিন্ট:

Log: 0.0

দেখে মনে হচ্ছে সুইফট 4 সম্পূর্ণরূপে ফাংশন কলটিকে সরিয়ে দেয়।


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