«أين لديك #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 اتباع مسار مختلف: لقد قاموا بدمج التجميع الشرطي مباشرة في اللغة، مما جعله أكثر أمانًا ووضوحًا.
بدلاً من #ifdef، تستخدم #if و#elseif و#else و#endif — بناء الجملة مشابه، لكنه يعمل على مستوى مترجم Swift، وليس المعالج الأولي. بالإضافة إلى ذلك، تمت إضافة العديد من الأعلام المدمجة التي سنناقشها الآن.
النهج 1: التوجيهات الكلاسيكية #if — أقرب قريب لـ #ifdef
\n\nالطريقة الأكثر مباشرة هي استخدام #if مع شروط محددة مسبقًا:
#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#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
- افتح المشروع في Xcode \n
- اختر target → Build Settings → Swift Compiler — Custom Flags \n
- ابحث عن حقل Active Compilation Conditions \n
- أضف أعلامك مفصولة بمسافة، على سبيل المثال:
BETA PAYMENT_V2\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++! أنت تقرر بنفسك