كلمة `open` المفتاحية في Swift: ما هي ولماذا يحتاجها المبتدئون

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

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

ابدأ الدورة

ماذا تخفي كلمة open المفتاحية في Swift؟ شرح للمبتدئين



هل سبق لك أن كتبت كلاسًا في Swift، وأضفت إليه public، ثم حاولت أن ترث منه في وحدة أخرى – وحصلت على خطأ في الترجمة؟ إذا كان الأمر كذلك، فأنت لست وحدك. هذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow بين مطوري Swift المبتدئين. آلاف الأشخاص يتعثرون بنفس الحجر: كلمة open المفتاحية.



في هذه المقالة، سنفهم مرة واحدة وإلى الأبد ما هو open في Swift، وكيف يختلف عن public، ومتى يجب استخدامه، ومتى لا يجب استخدامه مطلقًا. سنكتب كودًا حقيقيًا، وننظر إلى الأخطاء ونتعلم كيفية إصلاحها. هيا بنا!



نظام معدّلات الوصول في Swift: نبذة مختصرة



قبل أن نغوص في open، دعنا نتذكر ما هي مستويات الوصول في Swift. هناك خمسة مستويات (من الأكثر تقييدًا إلى الأكثر انفتاحًا):



  • private – يمكن الوصول إليه فقط داخل ملف واحد وإعلان واحد (مثل داخل الكلاس).
  • fileprivate – يمكن الوصول إليه داخل الملف بأكمله.
  • internal – يمكن الوصول إليه داخل الوحدة بأكملها (هذا هو المستوى الافتراضي).
  • public – يمكن الوصول إليه من وحدات أخرى، ولكن لا يمكن الوراثة أو إعادة التعريف.
  • open – يمكن الوصول إليه من وحدات أخرى، ويمكن الوراثة وإعادة التعريف.


المفاجأة الكبرى تكمن في الفرق بين public و open. للوهلة الأولى، يبدوان متشابهين: كلاهما يسمح بالوصول إلى الكلاس أو الدالة أو الخاصية من وحدة أخرى. لكن هناك فرق جوهري واحد سنشرحه الآن بالأمثلة.



مثال: كلاس public لا يمكن توسيعه



تخيل أنك تكتب مكتبة (إطار عمل) للتعامل مع الشبكة. تقوم بإنشاء كلاس NetworkService وتجعله public:



// الوحدة: MyNetworkingFrameworkpublic class NetworkService {    public func fetchData() {        print("جلب البيانات من الشبكة...")    }}


الآن، مطور آخر يربط إطار العمل الخاص بك ويريد إنشاء كلاس محسّن خاص به بناءً عليه:



// الوحدة: MyAppimport MyNetworkingFramework

// خطأ! لا يمكن الوراثة من كلاس publicclass MyNetworkService: NetworkService { override func fetchData() { print("الجلب المخصص الخاص بي...") }}


سيصدر المترجم خطأ. لماذا؟ لأن public هو وصول للقراءة فقط من وحدة أخرى. يمكنك استخدام نسخة من الكلاس، واستدعاء دواله، ولكن لا يمكنك الوراثة منه. هذا مقصود: مؤلف المكتبة يريد التحكم في أي الكلاسات يمكن توسيعها وأيها لا يمكن.



الحل: استخدام open



إذا أراد مؤلف المكتبة السماح بالوراثة، يجب عليه أن يحدد open صراحةً:



// الوحدة: MyNetworkingFrameworkopen class NetworkService {    open func fetchData() {        print("جلب البيانات من الشبكة...")    }}


الآن، في وحدة أخرى، يمكنك الوراثة وإعادة تعريف الدوال بسهولة:



// الوحدة: MyAppimport MyNetworkingFramework

class MyNetworkService: NetworkService { override func fetchData() { print("الجلب المخصص الخاص بي مع تسجيل إضافي...") super.fetchData() }}


هذا هو كل السحر. كلمة open المفتاحية هي إذن بالوراثة وإعادة التعريف خارج الوحدة.



لماذا open مهم للهندسة المعمارية؟



مطورو Swift و Apple لم يقدموا هذا الفرق عبثًا. إنه يساعد في تصميم واجهات برمجة تطبيقات (APIs) مستقرة وآمنة. تخيل أنك تصدر مكتبة، وجميع الكلاسات فيها هي open.

المدونات

توصيات الكتب