English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا المقال، ستعرف عن تحميل الدوال، عندما تحتاج إلى تحميل الدوال وكيفية تحميل مثال.
متعددة لها نفس الاسم ولكن مع معلمات مختلفةدوالتُدعى دوال التحميل.
تخيل أنك تقوم بتطوير لعبة إطلاق ناري، يمكن لللاعب فيها الهجوم على العدو باستخدام السكين، السكين، والسلاح الآلي. قد تكون حلتك للوظيفة الهجوم هي تحديد العمليات كدوال:
func attack() { //.. print("استخدام السكين للهجوم") } func attack() { //.. print("استخدام السيف للهجوم") } func attack() { //.. print("استخدام السلاح الآلي للهجوم") }
لكن، عندما تحاول تشغيل البرنامج المذكور أعلاه، ستحصل على خطأ في التجميع في Swift، مثل 'attack()' تم إعلانه هنا من قبللكن، هناك حل آخر ممكن هو تحديد أسماء مختلفة للدوال للوظائف المحددة، مثل ما يلي:
struct Knife { } struct Gun { } struct Blade { } func attackUsingKnife(weapon:Knife) { //.. print("استخدام السكين للهجوم") } func attackUsingBlade(weapon:Blade) { //.. print("استخدام السيف للهجوم") } func attackUsingGun(weapon:Gun) { //.. print("استخدام السلاح الآلي للهجوم") }
إذا لم تعرف ما هو struct، لا تقلق. الآن، فقط افترض أنك تقوم بإنشاء شيء في البرمجة لإنشاء شيء مادي، فإنك تقوم بإنشاء سكين، سلاح آلي، وسيف.
المشكلة الوحيدة لهذه الحلول هي أنك تحتاج إلى تذكر أسماء الدوال لاستدعاء العمليات الهجومية المحددة. وبالمثل، مع زيادة المستوى، قد يكون لدى اللاعب أدوات أخرى مثل القنابل، القذائف الصوتية، والبنادق الرشاشة للهجوم.
إن إنشاء دوال باستخدام أسماء مختلفة يتطلب وقتًا طويلاً، ويزيد من تكلفة تذكر أسماء الدوال لاستدعائها. وبشكل عام، هذا ليس واضحًا جدًا.
إذا كان من الممكن إنشاء دوال مختلفة باستخدام نفس الاسم لكل سلاح، فإن ذلك سيكون أفضل. بهذا الشكل، يكفي تذكر اسم دالة واحدة، ولن تضطر إلى القلق بشأن أسماء دوال الأسلحة الأخرى.
العملية التي نصفها الآن تُدعى تحميل الدوال. وفقًا للتعريف، عملية إنشاء دالة واحدة أو أكثر بنفس الاسم ولكن بكمية أو نوع المعلمات المختلفة تُدعى تحميل الدوال.
لنرى ذلك في المثال التالي:
struct Knife { } struct Gun { } struct Blade { } func attack(with weapon:Knife) { print("استخدام السكين للهجوم") } func attack(with weapon:Gun) { print("استخدام السلاح الآلي للهجوم") } func attack(with weapon:Blade) { print("استخدام السيف للهجوم") } attack(with: Gun()) attack(with: Blade()) attack(with: Knife())
عندما تقوم بتشغيل البرنامج أعلاه، الناتج سيكون:
هجوم بالبنادق هجوم بالسلاح هجوم بالسيف
في البرنامج أعلاه، أنشأنا ثلاث وظائف attack بنفس الاسم ولكن بأنواع مختلفة من المعلمات. بهذا الشكل، يمكنك تذكر اسم attack لاستدعاء الوظيفة.
استدعاء attack(with: Gun()) سيثير جملة func attack(with weapon: Gun) في الداخل.
استدعاء attack(with: Blade()) سيثير جملة func attack(with weapon: Blade) في الداخل.
استدعاء attack(with: Knife()) سيثير جملة func attack(with weapon: Knife) في الداخل.
func output(x: Int) { print("قيمة العدد هي \(x)") } func output(x: String) { print("قيمة السلسلة هي \(x)") } output(x: 2) output(x: "Swift")
عندما تقوم بتشغيل البرنامج أعلاه، الناتج سيكون:
قيمة العدد هي 2 قيمة السلسلة هي Swift
في البرنامج أعلاه، لدينا اثنين من الوظائف بنفس الاسم والعدد نفسه من المعلماتoutput(). ولكن، وظيفة output() الأولى تأخذ عددًا كاملًا كمعامل، بينما وظيفة output() الثانية تأخذ معامل String.
مثل المثال 1،
استدعاء output(x: 2) سيثير جملة func output(x: Int) في الداخل.
استدعاء output(x: "Swift") سيثير جملة func output(x: String) في الداخل.
func output() { print("صباح الخير!") } func output(text: String) { print(text) } func output(text: String, num: Int) { print("(text)(num)!") } output() output(text: "مساء الخير!") output(text1: "صباح الخير", num: 8)
عندما تقوم بتشغيل البرنامج أعلاه، الناتج سيكون:
صباح الخير! مساء الخير! مساء الخير
في البرنامج أعلاه، تم تغليب الوظيفة output() بناءً على عدد المعلمات.
الوظيفة output() بدون معلمات، الوظيفة output() بمعلمة واحدة: String، الوظيفة output() بمعلمتين: String و Int.
لنحاول تعديل المعدل من خلال تغيير اسم المعلمات ولكن الحفاظ على علامات المعلمات كما يلي:
func output(value text: String) { print(text) } func output(value num: Int) { print(num) } output(value: 2) output(value: "مرحبًا")
عندما تقوم بتشغيل البرنامج أعلاه، الناتج سيكون:
2 مرحبًا
كما ترون في البرنامج أعلاه، يمكن استخدام نفس علامات المعلمات للوظائف المعدلة. ولكن، وفقًا لمتطلبات المعدل، يجب أن يكون لديك عدد مختلف من المعلمات أو أنواع مختلفة من المعلمات.