# Swift 函数重载

> 原文： [https://www.programiz.com/swift-programming/function-overloading](https://www.programiz.com/swift-programming/function-overloading)

#### 在本文中，您将了解函数重载，何时需要函数重载以及如何重载示例。

具有相同名称但不同自变量的两个或多个[函数](/swift-programming/functions "Swift functions")被称为重载函数。

## 为什么需要函数重载？

想象您正在开发一个射击游戏，玩家可以使用刀，刃和枪来攻击敌人。 针对攻击函数的解决方案可能是将操作定义为以下函数：

```swift
func attack() {
    //..
    print("Attacking with Knife")
}

func attack() {
    //..
    print("Attacking with Blade")
}

func attack() {
    //..
    print("Attacking with Gun")
} 
```

但是，当您尝试运行上述程序时，由于先前在中声明了`attack()`而在 Swift 中会出现编译时错误。 但是，另一种解决方案可能是为特定功能定义不同的函数名称，例如：

```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](http://test.com) 。 如果没有，我们将在后面的章节中再次讨论。

此解决方案的唯一问题是，您需要记住函数名称以调用特定的攻击操作。 同样，随着等级的提高，玩家可能具有使用炸弹，手榴弹，散弹枪等进行攻击的其他功能。

用不同的名称创建函数很耗时，并且增加了记住函数名称以调用它的开销。 总而言之，这不是直观的。

如果可以为每种武器使用相同的名称但实现不同的功能来创建不同的函数，那就更好了。 这样，记住一个函数名称就足够了，您不必担心其他武器的函数名称。

* * *

## 什么是函数重载？

我们刚刚描述的过程称为函数重载。 根据定义，创建两个或两个以上具有相同名称但传递的参数数量或类型不同的函数的过程称为函数重载。

让我们在下面的示例中看到：

## 示例 1：函数重载

```swift
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()) 
```

当您运行上述程序时，输出将是：

```swift
Attacking with Gun
Attacking with Blade
Attacking with Knife 
```

在上面的程序中，我们创建了三个具有相同名称`attack`的不同函数。 但是，它接受不同的参数类型。 这样，记住`attack`名称即可调用该函数。

*   调用`attack(with: Gun())`触发函数`func attack(with weapon:Gun)`内部的语句。
*   调用`attack(with: Blade())`触发函数`func attack(with weapon:Blade)`内部的语句。
*   函数`func attack(with weapon:Knife)`内的调用`attack(with: Knife())`语句。

* * *

## 示例 2：基于不同参数类型的函数重载

```swift
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") 
```

运行该程序时，输出为：

```swift
The int value is 2
The string value is Swift 
```

在上面的程序中，我们有两个名称相同的函数`output()`和相同数量的参数。 但是，第一个`output()`函数将整数作为参数，第二个`output()`函数将`String`作为参数。

与示例 1 类似，

*   对`output(x: 2)`的调用会触发函数`func output(x:Int)`中的语句，并且
*   调用`output(x: "Swift")`会触发函数`func output(x:String)`中的语句。

## 示例 3：基于不同参数数量的函数重载

```swift
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) 
```

运行该程序时，输出为：

```swift
Good Morning!
Good Evening!
Good Night! 
```

在上面的程序中，函数`output()`已基于参数数量重载。

第一个`output()`不带参数，第二个`output()`带一个参数：`String`，第三个`output()`带两个参数：`String`和`Int`。

让我们尝试通过更改参数名称但使参数标签与以下内容相同来重载：

* * *

## 示例 4：使用相同参数标签的函数重载

```swift
func output(value text:String) {
    print(text)
}

func output(value num:Int) {
    print(num)
}

output(value: 2)
output(value: "Hello") 
```

运行该程序时，输出为：

```swift
2
Hello
```

如您所见，在上面的程序中，可以对重载函数使用相同的参数标签。 但是，根据重载的要求，您必须具有不同数量的参数或不同类型的参数。