Swift 函数重载

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

具有相同名称但参数不同的两个或多个函数称为重载函数。

为什么我们需要函数重载?

想象你正在开发一个射击游戏,玩家可以用刀、刀和枪攻击敌人。你对攻击功能的解决方案可能是将操作定义为函数:

func attack() {
    //..
    print("用刀攻击")
}

func attack() {
    //..
    print("用剑攻击")
}

func attack() {
    //..
    print("用枪攻击")
}

但是,当您尝试运行上述程序时,您将在Swift中收到编译时错误,如 'attack()' previously declared here。但是,另一种解决方案可能是为特定功能定义不同的函数名,如下所示:

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("int值是 \(x)")
}

func output(x:String) {
    print("字符串值是 \(x)")
}

output(x: 2)
output(x: "Swift")

当您运行上述程序时,输出将是:

int值是 2
字符串值是 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

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