具有相同名称但参数不同的两个或多个函数称为重载函数。
为什么我们需要函数重载?
假设您正在开发一种射击游戏,玩家可以使用刀,刃和枪来攻击敌人。针对攻击功能的解决方案可能是将操作定义为以下功能:
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。如果没有,我们将在后面的章节中再次讨论。
此解决方案的唯一问题是,您需要记住函数名称以调用特定的攻击操作。同样,随着等级的提高,玩家可能具有使用炸弹,手榴弹,shot弹枪等进行攻击的其他功能。
用不同的名称创建函数很耗时,并且增加了记住函数名称以调用它的开销。总而言之,这不是直观的。
如果可以为每种武器使用相同的名称创建不同的功能,那就更好了。这样,记住一个函数名称就足够了,您不必担心其他武器的函数名称。
什么是函数重载?
我们刚刚描述的过程称为函数重载。根据定义,创建两个或两个以上具有相同名称但传递的参数数量或类型不同的函数的过程称为函数重载。
让我们在下面的示例中看到这一点:
示例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())
当您运行上述程序时,输出将是:
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)
内部的callattack(with: 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")
当您运行上述程序时,输出将是:
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:基于不同数量参数的函数重载
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)
当您运行上述程序时,输出将是:
Good Morning!
Good Evening!
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: "Hello")
当您运行上述程序时,输出将是:
2
Hello
如您所见,在上面的程序中,可以对重载函数使用相同的参数标签。但是,根据重载的要求,您必须具有不同数量的参数或不同类型的参数。