#ifdef في Swift: كيفية استبدال التجميع الشرطي من C/C++

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

«أين لديك #ifdef؟» — أول سؤال لمطور C في Swift

\n\n

إذا كنت قد انتقلت يومًا من C أو C++ أو Objective-C إلى Swift، فمن المحتمل أنك تساءلت: «كيف يتم التجميع الشرطي هنا؟ أين #ifdef المفضل لدي؟» هذا أحد أكثر الأسئلة شيوعًا على Stack Overflow — وليس بدون سبب. في عالم Swift، لا يوجد معالج أولي بالمعنى التقليدي، لكن هذا لا يعني أنه لا يمكنك إدارة البناء بمرونة لمنصات أو تكوينات أو أوضاع تصحيح مختلفة.

\n\n

في هذه المقالة، سنستعرض أفضل الطرق لاستبدال #ifdef في Swift: من التوجيهات البسيطة إلى مخططات البناء المتقدمة. ستتعلم كيفية كتابة كود يعمل على كل من iOS وmacOS، وكيفية إخفاء معلومات التصحيح في الإصدار النهائي، وكيف لا تتشوش في أعلام المنصات. هيا بنا!

\n\n

لماذا لا يوجد #ifdef في Swift (وهذا أمر جيد)

\n\n

المعالج الأولي للغة C هو أداة قوية ولكنها خطيرة. فهو يعمل قبل المترجم، ولا يعرف عن الأنواع أو النطاقات. ونتيجة لذلك، من السهل الحصول على #define الذي يعطل كل شيء حوله. قرر مطورو Swift اتباع مسار مختلف: لقد قاموا بدمج التجميع الشرطي مباشرة في اللغة، مما جعله أكثر أمانًا ووضوحًا.

\n\n

بدلاً من #ifdef، تستخدم #if و#elseif و#else و#endif — بناء الجملة مشابه، لكنه يعمل على مستوى مترجم Swift، وليس المعالج الأولي. بالإضافة إلى ذلك، تمت إضافة العديد من الأعلام المدمجة التي سنناقشها الآن.

\n\n

النهج 1: التوجيهات الكلاسيكية #if — أقرب قريب لـ #ifdef

\n\n

الطريقة الأكثر مباشرة هي استخدام #if مع شروط محددة مسبقًا:

\n\n
#if DEBUG\n    print("هذا بناء تصحيح")\n    // يمكن أن يكون هنا تسجيل، فحوصات إضافية\n#else\n    print("هذا بناء إصدار نهائي")\n#endif
\n\n

إليك قائمة الأعلام المدمجة التي يمكنك استخدامها:

\n\n
    \n
  • DEBUG — محدد تلقائيًا لتكوين التصحيح (يضيفه Xcode بنفسه)
  • \n
  • os(iOS)، os(macOS)، os(tvOS)، os(watchOS) — التحقق من المنصة
  • \n
  • arch(x86_64)، arch(arm64)، arch(i386)، arch(arm) — بنية المعالج
  • \n
  • swift(>=5.0) — إصدار لغة Swift
  • \n
  • canImport(UIKit) — التحقق من توفر الوحدة
  • \n
  • targetEnvironment(simulator) — العمل على المحاكي
  • \n
\n\n

مثال على التحقق المدمج:

\n\n
#if os(iOS) || os(tvOS)\n    import UIKit\n    typealias PlatformView = UIView\n#elseif os(macOS)\n    import AppKit\n    typealias PlatformView = NSView\n#else\n    typealias PlatformView = Any\n#endif
\n\n

ينشئ هذا الكود اسمًا مستعارًا واحدًا لفئة العرض الذي يعمل على منصات مختلفة. مفيد جدًا للمكتبات عبر المنصات!

\n\n

النهج 2: شروط التجميع النشطة — #ifdef الخاص بك

\n\n

ماذا لو كنت بحاجة إلى إضافة علم خاص بك غير موجود في المجموعة القياسية؟ على سبيل المثال، BETA_FEATURES أو PAYMENT_INTEGRATION. لهذا، يوجد في Xcode شروط التجميع النشطة.

\n\n

كيفية الإعداد:

\n
    \n
  1. افتح المشروع في Xcode
  2. \n
  3. اختر target → Build Settings → Swift Compiler — Custom Flags
  4. \n
  5. ابحث عن حقل Active Compilation Conditions
  6. \n
  7. أضف أعلامك مفصولة بمسافة، على سبيل المثال: BETA PAYMENT_V2
  8. \n
\n\n

في الكود نستخدمه هكذا:

\n\n
#if BETA\n    print("تم تشغيل الإصدار التجريبي")\n    showBetaUI()\n#endif\n\n#if PAYMENT_V2\n    let paymentProcessor = NewPaymentProcessor()\n#else\n    let paymentProcessor = LegacyPaymentProcessor()\n#endif
\n\n

هذا هو الاستبدال المباشر لـ #ifdef من C/C++! أنت تقرر بنفسك

المدونات

توصيات الكتب