ما فائدة ال delegate ومتى يتم استخدامه في swift ؟

عبد الله • منذ 6 سنوات

السلام عليكم ورحمة الله وبركاته
ىأيت في الدروس شرح لكيفية التعامل مع tableview في بيئة xcode ومن خلال الشرح وضع في تحميل ال view التالي

tableview1.datasource = self
tableview1.delegate = self

بينما في شرح ءاخر وفي موقع ءاخر لم يتطرق لل delegate لا من قريب ولا من بعيد !!!

فالسؤال هل أجد أحد يشرح لي delegate ومتى يتم استخدامها ؟

الإجابة الصحيحة

Ahmed • منذ 6 سنوات

لو افترضنا اني اشتغل على تطبيق يعرض لي المطاعم القريبة من مكاني ، في البداية احتاج اعرف 

  1. العناصر اللي احتاجها في التطبيق
  2. التصميم المناسب اللي يخدم التطبيق

العناصر : بما ان التطبيق يعرض المطاعم القريبة فـ احتاج خريطة ( Map ) وكذلك احتاج قائمة ( tableView ) لعرض قائمة للمطاعم القريبة مع تفاصيل بسيطة مثل المسافة و التقييم وغيرها.

 الشكل التقريبي يكون مثل التالي : خارطة في الجزء العلوي من الشاشة ، والقائمة في الاسفل

قبل اتكلم عن التصميم ، هذا الشكل الهيكلي التقريبي للصفحة

 

الجزء المسؤول عن عرض الـ view هو viewContoller ، وداخل الـ view اضفنا الخريطة ( Map ) و القائمة ( tableView ).

التصميم الهيكلي للـ classes :  الخريطة ( Map ) و القائمة ( tableView ) كل واحد يمثل class/object مستقل بدواله وسلوكياته لكن احنا في حاجة ان نستخدم بعض سلوكيات الـخارطة وبعض سلوكيات القائمة داخل viewController ، آيش الحل ؟ 

نستخدم التصميم الوراثي ؟ غير منطقي لان viewController يجمع نوعين مختلفين وهو بنفسه مستقل عنهم فكيف نحوله الى subclass !! 

الطريقة الصحيحة هي استخدام الـ protocol + delegation و يصير بإمكاننا نكييف الـ viewController مع الـ UITableViewDelegate و UITableViewDataSource و MKMapViewDelegate. بهذي الحالة ، احنا خصصنا الـ viewController بأنه يكون المسؤول عن الآتصال ب MKMapView و tableView عند الحاجة.

الـ delegation وسيلة اتصال class/object ب آخر. وسيلة الاتصال تصير اثناء استخدام التطبيق : اما عن طريق الضغط على الشاشة او تحريك الصفحة لفوق او تحت ( scroll down or up ) او غيرها. 

الصورة توضح كيفية الـ delegation او التواصل بين الـ classes 

 

وفي مثالنا ، هذي الصورة توضح الـ delegation

الـ delegate و dataSource بالضبط نفس الشي ، لكن delegate مسؤول عن التحكم بالواجهة و dataSource مسؤول عن البيانات واستدعائها.

************************************************************************************************************************************************

إيش التصميم او الطريقة المناسبة لو كان تطبيقي فقط لعرض قائمة اسماء ، التطبيق يحتوي على عنصر واحد اللي هو قائمة ( tableView ) فقط ؟

في هذي الحالة نستخدم التصميم الوراثي ، ننشئ ملف ويكون من نوع او subclass لـ UITableViewController. بهذي الطريقة ما نحتاج الـ delegate و الـ dataSource ، بمعنى اصح ما نحتاج الـ protocol والـ delegation لان كل السلوكيات تورث او نقدر نوصلها عن طريق التوريث .. لكن دائم حاول تستخدم viewController و الـ delegation لان لو احتجت ان تعدل او تضيف عناصر مثل UIButton , UISegmentedController في المستقبل  ما راح تقدر تعدل او تضيف على UITableViewController فتضطر لحذف كل شي ..!! 

اتمنى يكون الشرح سهل وواضح 🙂 

الإجابات (2)

Ahmed • منذ 6 سنوات

سؤالك جداًً اعجبني وكثير من المبرمجين يخطئ في فهم الـ delegate

خلني ابدأ بالإجابة عن اول جزء ، ليش في دروس للـ tableView ذكروا الـ delegate وفي دروس اخرى لم يتم ذكرها ؟ 

لأنشاء tableView هناك طريقتين (تصميمين) إما بإستخدام : 

 

  1. OOP : يتم استخدام الـ UITableViewController كـ super class ، فبالمقابل انت تضطر لإستخدام الدوال والآوامر المعرفه ب الـ super class وهذي الطريقة تعرف ب polymorphism. هذا التصميم الوراثي ، كائن يورث كائن وهذي طريقة الاتصال او الوصول للدوال والأوامر اللي حاب تستخدمها. 
  2. POP : يتم استخدام الـ UITableViewDelegate & UITableViewDataSourse المعرفة بـ Protocols ، ف اذا حاب ان class او struct ياخذ الدوال والاوامر ( السلوكيات ) المعرفة داخل اي protocol لازم تكييفه او توافقه مع الـ protocol اللي حاب تستخدمه بـ اضافته بعد اسم الـ class ، بهذي الحالة نقول ان " class conforms to the protocol ". طيب طريقة التواصل ؟ استخدام الـ delegate.

الجزء الثاني من السؤال ، آيش الـ delegate ؟ 

في ثلاث انواع من طرق تصميم البرامج ، بشكل عام اذا نتكلم عن البرمجة: 

  • Creational design
  • Architectural design 
  • Communicational design

الـ delegation من ضمن التصاميم اللي تدخل تحت communicational design داخل البرنامج او التطبيق ، يتم استخدام هذا التصميم اذا طريقة الإتصال تكون بين نقطتين فقط (one-to-one). يختلف عن Notification Center او KVO ايضاًً هي احدى التصاميم اللي تدخل تحت communicational design لكن طريقة التواصل بين نقطة الى اكثر ( one-to-many ). 

الموضوع طويل جداًً يحتاج تفصيل ، لكن هذه النظرة العامة والمختصرة عن الـ delegate 

عبد الله: تبي الصراحة ؟ جوابك صعب الفهم احس انك تكلم واحد له خبره كبيرة ببرمجة ios ، ادري اني صدمتك بالرد لكن هذا الصحيح وانا حابب افهم شنو اعمل. اذا أمكن تفصل اكثر ولك جزيل الشكر مقدماً (:

Ahmed • منذ 6 سنوات
الإجابة الصحيحة
مميز

لو افترضنا اني اشتغل على تطبيق يعرض لي المطاعم القريبة من مكاني ، في البداية احتاج اعرف 

  1. العناصر اللي احتاجها في التطبيق
  2. التصميم المناسب اللي يخدم التطبيق

العناصر : بما ان التطبيق يعرض المطاعم القريبة فـ احتاج خريطة ( Map ) وكذلك احتاج قائمة ( tableView ) لعرض قائمة للمطاعم القريبة مع تفاصيل بسيطة مثل المسافة و التقييم وغيرها.

 الشكل التقريبي يكون مثل التالي : خارطة في الجزء العلوي من الشاشة ، والقائمة في الاسفل

قبل اتكلم عن التصميم ، هذا الشكل الهيكلي التقريبي للصفحة

 

الجزء المسؤول عن عرض الـ view هو viewContoller ، وداخل الـ view اضفنا الخريطة ( Map ) و القائمة ( tableView ).

التصميم الهيكلي للـ classes :  الخريطة ( Map ) و القائمة ( tableView ) كل واحد يمثل class/object مستقل بدواله وسلوكياته لكن احنا في حاجة ان نستخدم بعض سلوكيات الـخارطة وبعض سلوكيات القائمة داخل viewController ، آيش الحل ؟ 

نستخدم التصميم الوراثي ؟ غير منطقي لان viewController يجمع نوعين مختلفين وهو بنفسه مستقل عنهم فكيف نحوله الى subclass !! 

الطريقة الصحيحة هي استخدام الـ protocol + delegation و يصير بإمكاننا نكييف الـ viewController مع الـ UITableViewDelegate و UITableViewDataSource و MKMapViewDelegate. بهذي الحالة ، احنا خصصنا الـ viewController بأنه يكون المسؤول عن الآتصال ب MKMapView و tableView عند الحاجة.

الـ delegation وسيلة اتصال class/object ب آخر. وسيلة الاتصال تصير اثناء استخدام التطبيق : اما عن طريق الضغط على الشاشة او تحريك الصفحة لفوق او تحت ( scroll down or up ) او غيرها. 

الصورة توضح كيفية الـ delegation او التواصل بين الـ classes 

 

وفي مثالنا ، هذي الصورة توضح الـ delegation

الـ delegate و dataSource بالضبط نفس الشي ، لكن delegate مسؤول عن التحكم بالواجهة و dataSource مسؤول عن البيانات واستدعائها.

************************************************************************************************************************************************

إيش التصميم او الطريقة المناسبة لو كان تطبيقي فقط لعرض قائمة اسماء ، التطبيق يحتوي على عنصر واحد اللي هو قائمة ( tableView ) فقط ؟

في هذي الحالة نستخدم التصميم الوراثي ، ننشئ ملف ويكون من نوع او subclass لـ UITableViewController. بهذي الطريقة ما نحتاج الـ delegate و الـ dataSource ، بمعنى اصح ما نحتاج الـ protocol والـ delegation لان كل السلوكيات تورث او نقدر نوصلها عن طريق التوريث .. لكن دائم حاول تستخدم viewController و الـ delegation لان لو احتجت ان تعدل او تضيف عناصر مثل UIButton , UISegmentedController في المستقبل  ما راح تقدر تعدل او تضيف على UITableViewController فتضطر لحذف كل شي ..!! 

اتمنى يكون الشرح سهل وواضح 🙂 

Ali Majrashi: اجابة رهيبه ومفصله لو تنزل مقالات بتكون ابداع اهنيك

Ahmed: جزاك الله خير ، بحاول بإذن الله

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !