上一章Swift教程请查看:swift range范围
在本文中,你将通过示例了解函数重载、何时需要函数重载以及如何重载。
具有相同名称但不同参数的两个或多个函数称为重载函数。
为什么我们需要函数重载?
假设你正在开发一款射击游戏,玩家可以用knife刀、blade剑和gun枪攻击敌人,你的解决方案的攻击功能可能是定义成函数的行动为:
func attack() {
//..
print("Attacking with Knife")
}
func attack() {
//..
print("Attacking with Blade")
}
func attack() {
//..
print("Attacking with Gun")
}
但当你试图运行上述程序,你会得到一个编译时错误:‘attack()’
previously declared here,然而,另一个解决方案可能是为特定功能定义不同的函数名,如下:
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")
}
如果你不知道结构是什么,不要担心,现在,把它想象成在编程中创建物理对象的东西(类似类class)。
此解决方案的惟一问题是需要记住调用特定攻击操作的函数名,同时,随着等级的提高,玩家可以使用其它东西进行攻击。
创建具有不同名称的函数非常耗时,并且会增加记住要调用的函数名称的开销。
如果你可以用相同的名字为每个武器创建不同的函数,但是实现方式不同,那就更好了。这样,记住一个函数名就足够了,你就不必担心其他武器的函数名。
什么是函数重载?
我们刚才描述的过程称为函数重载,根据定义,创建两个或多个同名但传递的参数数量或类型不同的函数的过程称为函数重载。
让我们看看下面的例子:
例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(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")
在上面的程序中,我们有两个具有相同名称output()和相同数量参数的函数。但是,第一个output()函数采用整数作为参数,第二个output()函数采用字符串作为参数。
类似于例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")
可以看到,在上面的程序中,可以对重载函数使用相同的参数标签。但是,根据重载的要求,你必须具有不同数量的参数或不同类型的参数。