English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift базовый учебник

Операторы Swift

Swift управление потоком

Swift коллекции

Swift функции

Swift 高级

Перегрузка функций в Swift

В этой статье вы узнаете о перегрузке функций, когда она нужна и как это сделать на примерах.

имеющие одно и то же имя, но с различными параметрамифункцииназывается перегрузкой функций.

Почему нам нужна перегрузка функций?

Представьте, что вы разрабатываете стреляющую игру, в которой игрок может атаковать врага мечом, ножом и ружьем. Ваше решение для функции атаки может заключаться в определении операций как функций:

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, не волнуйтесь. Теперь просто представляйте, что это что-то, создающее физические объекты в программировании, и вы создаете меч, ружье и нож.

Единственная проблема с этим решением в том, что вам нужно запомнить имя функции, чтобы вызвать определенную операцию атаки. Также, по мере повышения уровня, игрок может иметь другие функции атаки, такие как использование бомб, фугасов, ружей и т.д.

Создание функций с различными именами требует много времени и увеличивает затраты на запоминание имен функций для их вызова. В общем, это не очень интуитивно.

Если можно создать разные функции с одним и тем же именем для каждого оружия, то это лучше. Таким образом, запомнить одно имя функции достаточно, и вам не нужно беспокоиться о названиях функций других оружия.

Что такое перегрузка функций?

Процесс создания двух или более функций с одним и тем же именем, но с различным количеством или типом передаваемых параметров, называется перегрузкой функций. По определению, это процесс.

Давайте посмотрим на это на следующем примере:

Пример 1: Перегрузка функций

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) в теле функции.

Пример 2: Перегрузка функций на основе типа параметров

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) в теле функции.

Пример 3: Перегрузка функций на основе количества параметров

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.

Давайте попробуем перегрузить, изменив имена параметров, но оставив метки параметров без изменений, как показано ниже:

Пример 4: Перегрузка функций с одинаковыми метками параметров

func output(value text: String) {
    print(text)
}
func output(value num: Int) {
    print(num)
}
output(value: 2)
output(value: "Привет")

Когда вы запустите вышеуказанный программный код, вывод будет следующим:

2
Привет

Как вы видите, в вышеуказанном программном коде, можно использовать одинаковые метки параметров для перегруженных функций. Однако, в соответствии с требованиями перегрузки, вам необходимо иметь разное количество параметров или параметры различных типов.