ملف الثوابت العامة في Swift: كل ما أردت معرفته ولكن كنت تخشى السؤال

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

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

ابدأ الدورة

لماذا نحتاج إلى ملف ثوابت عامة في Swift؟

\n\n

كل مطور iOS واجه مرة واحدة على الأقل في حياته موقفًا تكون فيه نفس القيم — عنوان URL للخادم، مفاتيح API، معرفات الخلايا، الهوامش — موزعة في جميع أنحاء المشروع. وفجأة يقول المدير: "غيّر عنوان URL الأساسي". تفتح المشروع وتبدأ المهمة: البحث عن جميع تكرارات "https://old.api.com" واستبدالها بالجديد. هل هذا مألوف؟

\n\n

لهذا السبب بالتحديد نحتاج إلى ملف الثوابت العامة في Swift — مكان واحد يتم فيه تخزين جميع "الأرقام السحرية" والسلاسل النصية. في هذه المقالة، سنحلل الأسئلة الأكثر شيوعًا من Stack Overflow (الموضوع حصل على آلاف المشاهدات!) وسنقدم إجابات واضحة مع أمثلة كود. فلنبدأ!

\n\n

السؤال 1: كيف يمكن إنشاء ملف ثوابت بسيط في Swift؟

\n\n

الطريقة الأكثر مباشرة هي استخدام struct مع خصائص ثابتة (static). لماذا struct وليس class؟ لأن الهياكل هي أنواع قيمية (value types)، فهي أخف ولا تتطلب مُهيئًا (initializer).

\n\n
// Constants.swift\nimport Foundation\n\nstruct AppConstants {\n    static let baseURL = "https://api.myapp.com/v1"\n    static let apiKey = "your-secret-key-here"\n    static let defaultTimeout: TimeInterval = 30.0\n    static let maxRetryCount = 3\n}
\n\n

الاستخدام بسيط: AppConstants.baseURL. هذا كل شيء، لا مزيد من السلاسل السحرية. ثوابت Swift مع let تضمن عدم تغيير القيمة عن طريق الخطأ.

\n\n

لماذا لا نستخدم المتغيرات العامة (global variables)؟

\n\n

يمكنك بالطبع كتابة:

\n\n
let baseURL = "https://api.myapp.com/v1"
\n\n

لكن هذه هي ملف الثوابت العامة في Swift في أبسط صوره. المشكلة: لا يوجد نطاق أسماء (namespace). إذا كان لديك 50 ثابتًا، فسوف ترتبك بسرعة أي ثابت ينتمي إلى ماذا. struct يحل هذه المشكلة بأناقة.

\n\n

السؤال 2: Enum أم Struct — أيهما تختار للثوابت؟

\n\n

على Stack Overflow، تدور نقاشات حامية. دعنا نحلل كلا النهجين.

\n\n

Struct (الخيار الشائع)

\n\n
struct UIConstants {\n    static let cornerRadius: CGFloat = 12.0\n    static let defaultPadding: CGFloat = 16.0\n    static let animationDuration: Double = 0.3\n}
\n\n

الإيجابيات: مألوف، يمكن إنشاء نسخ (على الرغم من أن ذلك غير مطلوب عادةً)، سهل التوسيع باستخدام extension.

\n\n

السلبيات: من الناحية الفنية يمكن كتابة UIConstants()، وهو أمر لا معنى له.

\n\n

Enum (الخيار الأكثر صرامة)

\n\n
enum NetworkConstants {\n    static let baseURL = "https://api.myapp.com/v1"\n    static let apiVersion = "2.0"\n    static let defaultHeaders: [String: String] = [\n        "Content-Type": "application/json"\n    ]\n}
\n\n

الإيجابيات: لا يمكن إنشاء نسخة — المترجم (compiler) لن يسمح بذلك. نطاق أسماء نقي. مثالي لـ ثوابت التعداد في Swift.

\n\n

السلبيات: يعتبرها البعض "اختراقًا" — استخدام التعداد (enum) ليس لغرضه الأساسي.

\n\n

حكمي: إذا كنت تريد أن تكون مطورًا "صحيحًا" وتحمي نفسك من إنشاء نسخة عن طريق الخطأ — استخدم enum. إذا كنت تعمل في فريق اعتاد الجميع فيه على struct — استخدم struct. كلا الخيارين صحيحان.

\n\n

السؤال 3: كيف تنظم الثوابت حسب الفئات؟

\n\n

عندما يكبر المشروع، يتحول ملف واحد إلى مزبلة. الحل — هياكل متداخلة أو ملفات منفصلة لكل فئة.

\n\n

الخيار A: هياكل متداخلة (في ملف واحد)

\n\n
struct Constants {\n    struct Network {\n        static let baseURL = "https://api.myapp.com"\n        static let timeout: TimeInterval = 30\n    }\n    \n    struct UI {\n        static let cornerRadius: CGFloat = 8\n        static let buttonHeight: CGFloat = 44\n    }\n    \n    struct Storage {\n        static let userDefaultsKey = "com.myapp.user"\n        static let maxCacheSize =                

المدونات

توصيات الكتب