У цій статті ви дізнаєтеся про перевантаження функцій, коли нам потрібно перевантаження функцій та як перевантажити прикладами.
Дві або більше функцій з однаковим іменем, але різними аргументами називаються перевантаженими функціями.
Навіщо нам перевантаження функцій?
Уявіть, що ви розробляєте шутер, де гравець може атакувати своїх ворогів за допомогою ножа, леза та пістолета. Вашим рішенням для функціональності атаки може бути визначення дій у функціях як:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Але при спробі запустити вищезазначену програму, ви отримаєте помилку часу компіляції в Swift як попередньо заявлену тут "атаку ()" . Однак іншим рішенням може бути визначення різних назв функцій для певної функціональності як:
struct Knife ( ) struct Gun ( ) struct Blade ( ) func attackUsingKnife(weapon:Knife) ( //… print("Attacking with Knife") ) func attackUsingBlade(weapon:Blade) ( //… print("Attacking with Blade") ) func attackUsingGun(weapon:Gun) ( //… print("Attacking with Gun") )
Не хвилюйтеся, якщо ви не знаєте, що таке структура. Наразі просто сприймайте це як щось, що створює фізичний об’єкт у програмуванні, отже, ви створюєте ніж, пістолет та лезо. Якщо ви хочете дізнатись більше, див. Swift Struct. Якщо ні, ми повернемося до цього у наступних розділах.
Єдина проблема цього рішення - вам потрібно запам’ятати імена функцій, щоб викликати конкретну дію атаки. Крім того, коли рівень піднімається, гравець може мати додаткові функції для атаки за допомогою бомби, гранати, рушниці тощо.
Створення функції з різними іменами займає багато часу і збільшує загальні витрати на запам'ятовування імені функції для її виклику. Загалом, це не інтуїтивно.
Було б набагато краще, якби ви могли створити різні функції з однаковою назвою, але різною реалізацією для кожної зброї. Таким чином, запам’ятати одне ім’я функції досить, і вам не доведеться турбуватися про назви функцій для іншої зброї.
Що таке перевантаження функції?
Процес, який ми щойно описали, відомий як перевантаження функції. За визначенням, процес створення двох або більше двох функцій з однаковим іменем, але з різною кількістю або типами переданих параметрів, називається перевантаженням функції.
Давайте побачимо це в наведеному нижче прикладі:
Приклад 1: Перевантаження функції
struct Knife ( ) struct Gun ( ) struct Blade ( ) func attack(with weapon:Knife) ( print("Attacking with Knife") ) func attack(with weapon:Gun) ( print("Attacking with Gun") ) func attack(with weapon:Blade) ( print("Attacking with Blade") ) 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)
.
Приклад 2: Перевантаження функції на основі різних типів параметрів
func output(x:Int) ( print("The int value is (x)") ) func output(x:String) ( print("The string value is (x)") ) output(x: 2) output(x: "Swift")
Коли ви запускаєте вищезазначену програму, результат буде:
Значення int - 2 Значення рядка - Swift
У наведеній вище програмі ми маємо дві функції з однаковою назвою output()
та однаковою кількістю параметрів. Однак перша output()
функція приймає ціле число як параметр, а друга output()
функція приймає String
як параметр.
Подібно до Прикладу 1,
- виклик
output(x: 2)
викликає оператор усередині функціїfunc output(x:Int)
і - виклик
output(x: "Swift")
викликає оператор усередині функціїfunc output(x:String)
.
Приклад 3: Перевантаження функції на основі різної кількості параметрів
func output() ( print("Good Morning!") ) func output(text:String) ( print(text) ) func output(text:String, num:Int) ( print("(text)(num)!") ) output() output(text: "Good Evening!") output(text1: "Good N", num: 8)
Коли ви запускаєте вищезазначену програму, результат буде:
Доброго ранку! Добрий вечір! Надобраніч!
У вищезазначеній програмі функція output()
перевантажена на основі кількості аргументів.
Перший output()
не бере параметрів, другий output()
приймає один параметр:, String
а третій output()
приймає два параметри: String
і Int
.
Спробуємо перевантажити, змінивши ім'я параметра, але зберігаючи мітку аргументу такою ж:
Приклад 4: Перевантаження функції з тією ж міткою аргументу
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
Коли ви запускаєте вищезазначену програму, результат буде:
2 Привіт
Як бачите, у наведеній вище програмі ви можете використовувати ту саму мітку аргументу для перевантажених функцій. Однак, як вимагає перевантаження, ви повинні мати різну кількість параметрів або різні типи параметрів.