В тази статия ще научите за претоварването на функциите, кога имаме нужда от претоварване на функциите и как да претоварим с примери.
Две или повече функции с едно и също име, но различни аргументи са известни като претоварени функции.
Защо се нуждаем от претоварване на функциите?
Представете си, че разработвате игра-стрелец, където играчът може да атакува враговете си с помощта на нож, острие и пистолет. Вашето решение за функционалността на атаката може да е да дефинирате действията във функции като:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Но когато се опитате да стартирате горната програма, ще получите грешка във времето за компилиране в Swift като предварително заявена тук 'attack ()' . Друго решение обаче може да бъде дефинирането на различни имена на функции за конкретната функционалност като:
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 Здравейте
Както можете да видите, в горната програма можете да използвате същия етикет на аргумент за претоварените функции. Както обаче изисква претоварването, трябва да имате различен брой параметри или различни видове параметри.