সুইফট: কী কী প্রয়োগ করতে প্রিপ্রেসেসর ফ্ল্যাগগুলি (if #if DEBUG` এর মতো) ব্যবহার করবেন?


95

ইন Objective-Cকখনও কখনও বিকল্প API কীগুলির (উদাহরণস্বরূপ পার্থক্য রিলিজ এবং ডিবাগ কী মধ্যে বিশ্লেষণ প্যাকেজ, MixPanel, একরাশ বা Crashlytics মত) নির্ধারণ করতে স্ট্যাটিক স্ট্রিং ধ্রুবক ব্যবহার করতে দরকারী ছিল:

#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif

এবং তারপর...

[Analytics startSession:API_KEY];

এটি কীভাবে সুইফটে অনুবাদ করে, যেহেতু সুইফ্ট সংকলক আর প্রিপ্রসেসর ব্যবহার করে না?

উত্তর:


161

অ্যাপল এক্সকোড 8 হিসাবে সুইফ্ট প্রিপ্রেসেসর পতাকাগুলির জন্য সম্পূর্ণ সমর্থন অন্তর্ভুক্ত করেছে , সুতরাং "অন্যান্য সুইফ্ট পতাকা" এ এই মানগুলি সেট করার দরকার নেই।

নতুন সেটিংটিকে "অ্যাক্টিভ সংকলন শর্তগুলি" বলা হয়, যা প্রিপ্রসেসর পতাকাগুলির সমতুল্য সুইফটের জন্য শীর্ষ স্তরের সমর্থন সরবরাহ করে। আপনি "অন্যান্য সুইফ্ট পতাকা" হিসাবে ঠিক তেমনভাবে ব্যবহার করুন, "-D" দিয়ে মানটি প্রিপেন্ড করার দরকার নেই (তাই এটি কেবলমাত্র একটু পরিষ্কার)।

থেকে Xcode 8 রিলিজ নোট :

Active Compilation Conditionsসুইফট সংকলকটিতে শর্তসাপেক্ষ সংকলন পতাকা পাস করার জন্য একটি নতুন বিল্ড সেটিংস। এই সেটিংটির মানটির প্রতিটি উপাদান একইভাবে -ডি-এর সাথে পূর্বনির্ধারিত সুইফটকে চলে যায় , একই উপায়ে Preprocessor Macrosপাসের উপাদানগুলি ঝাঁকুনিতে পড়ে । (22457329)

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

আপনি উপরের সেটিংটি এর মতো ব্যবহার করেন:

#if DEBUG
    let accessToken = "DebugAccessToken"
#else
    let accessToken = "ProductionAccessToken"
#endif

4
দ্রষ্টব্য: আপনার = 1 বা অন্য কোনও = মান নির্দিষ্ট করা উচিত নয় । বরং, আপনাকে কেবল পতাকাটির নাম নির্দিষ্ট করতে হবে। :]
জেআরজি-বিকাশকারী

@ জেআরজি-বিকাশকারী আমি দ্বিমত পোষণ করি না, তবে আপনার মন্তব্য এখানে কীভাবে প্রযোজ্য তা আমি নিশ্চিত নই।
ড্যান লোয়েহের্জেজ

9
এটি একটি সহায়ক উত্তর, তবে একটি উদ্দেশ্য-সি ব্যাকগ্রাউন্ড থেকে এসেছি (যেমনটি আমি অনেক আইওএস বিকাশকারীদের ধারণা করছি), আমি ধরে নিয়েছি যে আমার নির্দিষ্টকরণের প্রয়োজন =1... এটি কেন কাজ করছে না তা নির্ধারণের চেষ্টা করার জন্য আমি কিছুটা সময় হারাতে পেরেছি যখন আমি করেছি। সুতরাং, আমি ভেবেছিলাম পরের সহকর্মীকে সাহায্য করার জন্য এই টিডবিটটি ভাগ করব। :] যাইহোক, এখানে আপনার উত্তরের জন্য ধন্যবাদ!
জেআরজি-বিকাশকারী

4
@ জেআরজি-বিকাশকারী, @ ড্যান লোয়েহের্জে আমি DEBUGভিতরে Active Compilation Conditionsএবং DEBUG=1ভিতরে উভয়ই সেট করে রেখেছি Preprocessor Macrosএবং এই কনফিগারেশনটি মোটেই কার্যকর হয় না। আমি কি অপসারণ করব DEBUG=1?? উপরের মন্তব্যগুলি থেকে পরিষ্কার নয়।
ভাভিন_ম

4
আপনি @ একেবারে ঠিক বলেছেন আমি আমার টার্গেট সেটিংসে সংরক্ষণাগার কনফিগারেশনের জন্য "DEBUG" সেট করেছিলাম, তাই প্রতিবার এটি একটি ডিবাগ স্টেটমেন্ট চালায় এবং কখনই রিলিজ শর্তটি চালায় না। যে কেউ সমস্যার মুখোমুখি হচ্ছে তবে দয়া করে আপনার টার্গেটের Build Configurationপ্রথমটি পরীক্ষা করুন । আরও তথ্যের জন্য এই উত্তরটি stackoverflow.com/questions/9063100/… দেখুন।
ভাভিন_ম

131

আপডেট হয়েছে: এক্সকোড 8 এখন এটি স্বয়ংক্রিয়ভাবে সমর্থন করে, উপরের @ ড্যানলওয়েনার্জের প্রতিক্রিয়া দেখুন।

এক্সকোড 8 এর আগে, আপনি এখনও একইভাবে ম্যাক্রো ব্যবহার করতে পারবেন:

#if DEBUG
let apiKey = "KEY_A"
#else
let apiKey = "KEY_B"
#endif

তবে এগুলিকে সুইফ্ট বাছাই করার জন্য আপনাকে আপনার টার্গেটের বিল্ড সেটিংসে "অন্যান্য সুইফ্ট পতাকা" সেট করতে হবে:

  • আপনার টার্গেটের জন্য বিল্ড সেটিংস খুলুন
  • "অন্যান্য সুইফ্ট পতাকা" অনুসন্ধান করুন
  • -Dপতাকা ব্যবহারের আগে আপনি যে ম্যাক্রোগুলি ব্যবহার করতে চান তা যুক্ত করুন

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


আপনি আমার দিন তৈরি! আমার জন্য এটি -Dউপসর্গ ছাড়া কাজ করে না
নাম

5

ফলোআপ পর্যবেক্ষণ হিসাবে, এপিআই কী / গোপনীয় সারণীতে ভান্ডারটিতে রাখার চেষ্টা করবেন না। ব্যবহারকারীর পরিবেশের ভেরিয়েবলগুলিতে কী / গোপনীয়তা লোড করতে একটি সিক্রেট পরিচালনা ব্যবস্থা ব্যবহার করুন। অন্যথায় পদক্ষেপ 1 প্রয়োজনীয়, যদি গ্রহণযোগ্য হয়।

  1. ঘেরের ভাণ্ডারগুলিতে উপরের একটি সরলখুলি ফাইলটিতে "সিক্রেটস" রাখুন
  2. ../set_keys.shএকটি তালিকা তৈরি করুন যা export API_KEY_A='<plaintext_key_aef94c5l6>'(মূল্যায়ন প্রতিরোধে একক উদ্ধৃতি ব্যবহার করুন)
  3. একটি রান স্ক্রিপ্ট পর্যায় যুক্ত করুন যা source ../set_keys.shএটিকে সম্পাদন আদেশের শীর্ষে স্থানান্তর করতে পারে
  4. বিল্ড সেটিংস> প্রিপ্রোসেসর ম্যাক্রোগুলিতে, প্রয়োজনীয় হিসাবে সংজ্ঞা হিসাবে যুক্ত করুন API_KEY_A="$API_KEY_A"

এটি পরিবেশক পরিবর্তনশীলকে সংকলক সংজ্ঞায়িত করে যা পরবর্তীকালে প্রতিটি উত্স ফাইলের জন্য প্রতিটি ঝাঁকুনির জন্য ব্যবহৃত হয়।

ডিরেক্টরি কাঠামোর উদাহরণ

[10:33:15] ~/code/memo yes? tree -L 2 .
.
├── Memo
│   ├── Memo
│   ├── Memo.xcodeproj
│   ├── Memo.xcworkspace
│   ├── Podfile
│   ├── Podfile.lock
│   └── Pods
└── keys

0

সুইফ্ট প্যাকেজগুলিতে আপনাকে নিজের ফাইলটিতে swiftSettingsযুক্তির ভিতরে .targetএটি করতে Package.swiftহবে। ব্যবহার করুন defineপদ্ধতি (অ্যাপল ডকুমেন্টেশন) বা সুইফট ডকুমেন্টেশন

targets: [
.target(name: String,
            dependencies: [Target.Dependency],
            path: String?,
            exclude: [String]?,
            sources: [String]?,,
            cSettings: [CSetting]?,
            cxxSettings: [CXXSetting]?,
            swiftSettings: [SwiftSetting]?,
            linkerSettings: [LinkerSetting]?),

আমার মত দেখাচ্ছে এবং এটি কাজ করে!

            swiftSettings: [
               .define("VAPOR")
            ]

আমার কোডে আমি শর্তসাপেক্ষে এটি ব্যবহার করে সংকলন করতে পারি:

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