Στη 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:)'