English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье вы узнаете о перегрузке функций, когда она нужна и как это сделать на примерах.
имеющие одно и то же имя, но с различными параметрамифункцииназывается перегрузкой функций.
Представьте, что вы разрабатываете стреляющую игру, в которой игрок может атаковать врага мечом, ножом и ружьем. Ваше решение для функции атаки может заключаться в определении операций как функций:
func attack() { //.. print("Использование ножа для атаки") } func attack() { //.. print("Использование меча для атаки") } func attack() { //.. print("Использование ружья для атаки") }
Но когда вы пытаетесь запустить вышеуказанный код, вы получите компиляторные ошибки в Swift, такие как 'attack()' уже объявлено здесьНо, возможно, другое решение - определить разные имена функций для специфических функций, как показано ниже:
struct Knife { } struct Gun { } struct Blade { } func attackUsingKnife(weapon: Knife) { //.. print("Использование ножа для атаки") } func attackUsingBlade(weapon: Blade) { //.. print("Использование меча для атаки") } func attackUsingGun(weapon: Gun) { //.. print("Использование ружья для атаки") }
Если вы не знаете, что такое struct, не волнуйтесь. Теперь просто представляйте, что это что-то, создающее физические объекты в программировании, и вы создаете меч, ружье и нож.
Единственная проблема с этим решением в том, что вам нужно запомнить имя функции, чтобы вызвать определенную операцию атаки. Также, по мере повышения уровня, игрок может иметь другие функции атаки, такие как использование бомб, фугасов, ружей и т.д.
Создание функций с различными именами требует много времени и увеличивает затраты на запоминание имен функций для их вызова. В общем, это не очень интуитивно.
Если можно создать разные функции с одним и тем же именем для каждого оружия, то это лучше. Таким образом, запомнить одно имя функции достаточно, и вам не нужно беспокоиться о названиях функций других оружия.
Процесс создания двух или более функций с одним и тем же именем, но с различным количеством или типом передаваемых параметров, называется перегрузкой функций. По определению, это процесс.
Давайте посмотрим на это на следующем примере:
struct Knife { } struct Gun { } struct Blade { } func attack(with weapon: Knife) { print("Использование ножа для атаки") } func attack(with weapon: Gun) { print("Использование ружья для атаки") } func attack(with weapon: Blade) { print("Использование меча для атаки") } 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) в теле функции.
func output(x: Int) { print("Целочисленное значение - \(x)") } func output(x: String) { print("Строковое значение - \(x)") } output(x: 2) output(x: "Swift")
Когда вы запустите вышеуказанный программный код, вывод будет следующим:
Целочисленное значение - 2 Строковое значение - Swift
В上面的 программе у нас есть две функции с одинаковым именем и количеством параметров output(). Но первая функция output() принимает целое число в качестве параметра, а вторая функция output() принимает строку в качестве параметра.
Как и в примере 1,
Вызов output(x: 2) вызовет строку func output(x: Int) в теле функции
Вызов output(x: "Swift") вызовет строку func output(x: String) в теле функции.
func output() { print("Доброе утро!") } func output(text: String) { print(text) } func output(text: String, num: Int) { print("(text)(num)!") } output() output(text: "Добрый вечер!") output(text1: "Добрый N", num: 8)
Когда вы запустите вышеуказанный программный код, вывод будет следующим:
Доброе утро! Добрый вечер! Good Night!
В вышеуказанном программном коде функция output() уже перегружена в зависимости от количества параметров.
Первый output() без параметров, второй output() с одним параметром: String, третий output() с двумя параметрами: String и Int.
Давайте попробуем перегрузить, изменив имена параметров, но оставив метки параметров без изменений, как показано ниже:
func output(value text: String) { print(text) } func output(value num: Int) { print(num) } output(value: 2) output(value: "Привет")
Когда вы запустите вышеуказанный программный код, вывод будет следующим:
2 Привет
Как вы видите, в вышеуказанном программном коде, можно использовать одинаковые метки параметров для перегруженных функций. Однако, в соответствии с требованиями перегрузки, вам необходимо иметь разное количество параметров или параметры различных типов.