المسارات
/
Swift
Swift
/
المنهج
/
التحميل الزائد للدوال
ال

التحميل الزائد للدوال في Swift

1 تمرين

نبذة عن التحميل الزائد للدوال

في Swift، يمكنك تعريف عدة دوال بالاسم نفسه ما دامت توقيعاتها مختلفة. تُعرف هذه الممارسة باسم التحميل الزائد للدوال.

لنلقِ نظرة على الدالة الأساسية التالية:

func add(_ x: Int, and y: Int, doubleResult: Bool) -> Int {
    let sum = x + y
    return doubleResult ? sum * 2 : sum
}

let twentySix = add(6, and: 7, doubleResult: true)
// => 26

في Swift، تُعدّ الدالتان الحاملتان للاسم نفسه دالتين مختلفتين إذا تحقق أيٌّ من الشروط التالية:

  • أن يختلف عدد المعاملات بينهما.
  • أن تختلف تسميات الوسائط الخارجية بينهما.
  • أن تختلف أنواع المعاملات بينهما.
  • أن يختلف نوع الإرجاع بينهما (بشرط أن يوضّح سياق الاستدعاء أيّهما المقصود).

بالنظر إلى دالة add الأصلية أعلاه، فإن كلًّا من التعريفات التالية يُعدّ تحميلًا زائدًا متميزًا وصالحًا في البرنامج نفسه:

// 1. Different number of parameters
func add(_ x: Int, and y: Int) -> Int {
    x + y
}

let eleven = add(5, and: 6)
// => 11

// 2. Different parameter type (Double instead of Int)
func add(_ x: Double, and y: Int, doubleResult: Bool) -> Double {
    let sum = x + Double(y)
    return doubleResult ? sum * 2 : sum
}

let twentySeven = add(6.5, and: 7, doubleResult: true)
// => 27.0

// 3. Different argument label (doubleThat instead of doubleResult)
func add(_ x: Int, and y: Int, doubleThat: Bool) -> Int {
    let sum = x + y
    return doubleThat ? sum * 2 : sum
}

let thirteen = add(6, and: 7, doubleThat: false)
// => 13

التحميل الزائد حسب نوع الإرجاع

يمكن أيضًا تحميل الدوال تحميلًا زائدًا اعتمادًا على نوع الإرجاع وحده. لكن عند استدعاء دالة كهذه، عليك تحديد النوع أو توفير سياق ليعرف المصرّف أي نسخة تقصد:

func add(_ x: Int, and y: Int, doubleResult: Bool) -> Double {
    let sum = Double(x + y)
    return doubleResult ? sum * 2 : sum
}

// Ambiguous call (compiler cannot decide whether you want Int or Double):
// let thirty = add(6, and: 9, doubleResult: true)

// Resolved with an explicit type annotation:
let thirty: Double = add(6, and: 9, doubleResult: true)
// => 30.0

ما لا يميّز بين التحميلات الزائدة

تغيير اسم المعامل الداخلي فقط، دون تغيير تسمية الوسيط أو نوع المعامل أو عدد المعاملات، لا ينشئ دالة مختلفة. ويعتبر المصرّف ذلك إعلانًا مكررًا غير صالح:

func add(_ w: Int, and y: Int, doubleResult: Bool) -> Int {
    let sum = w + y
    return doubleResult ? sum * 2 : sum
}
// Error: Invalid redeclaration of 'add(_:and:doubleResult:)'
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم التحميل الزائد للدوال