Διαδρομές
/
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 Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Υπερφόρτωση συναρτήσεων