Swift 函數(shù)重載

在本文中,您將了解函數(shù)重載,何時需要函數(shù)重載以及如何重載示例。

具有相同名稱但參數(shù)不同的兩個或多個函數(shù)稱為重載函數(shù)。

為什么我們需要函數(shù)重載?

想象你正在開發(fā)一個射擊游戲,玩家可以用刀、刀和槍攻擊敵人。你對攻擊功能的解決方案可能是將操作定義為函數(shù):

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

func attack() {
    //..
    print("用劍攻擊")
}

func attack() {
    //..
    print("用槍攻擊")
}

但是,當您嘗試運行上述程序時,您將在Swift中收到編譯時錯誤,如 'attack()' previously declared here。但是,另一種解決方案可能是為特定功能定義不同的函數(shù)名,如下所示:

struct Knife {
}
struct Gun {
}
struct Blade {
}

func attackUsingKnife(weapon:Knife) {
    //..
    print("用刀攻擊")
}

func attackUsingBlade(weapon:Blade) {
    //..
    print("用劍攻擊")
}

func attackUsingGun(weapon:Gun) {
    //..
    print("用槍攻擊")
}

如果您不知道struct是什么,也不要擔心。 現(xiàn)在,只要把它看作是在編程中創(chuàng)建物理對象的東西,那么您就是在創(chuàng)建一把刀、槍和劍。

此解決方案的唯一問題是,您需要記住函數(shù)名稱以調(diào)用特定的攻擊操作。同樣,隨著等級的提高,玩家可能具有使用炸彈,手榴彈,獵槍等進行攻擊的其他功能。

用不同的名稱創(chuàng)建函數(shù)很耗時,并且增加了記住函數(shù)名稱以調(diào)用它的開銷??偠灾?,這不是很直觀。

如果可以為每種武器使用相同的名稱創(chuàng)建不同的函數(shù),那就更好了。這樣,記住一個函數(shù)名稱就足夠了,您不必擔心其他武器的函數(shù)名稱。

什么是函數(shù)重載?

我們剛剛描述的過程稱為函數(shù)重載。根據(jù)定義,創(chuàng)建兩個或兩個以上具有相同名稱但傳遞的參數(shù)數(shù)量或類型不同的函數(shù)的過程稱為函數(shù)重載。

讓我們在下面的示例中看到這一點:

示例1:函數(shù)重載

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

當您運行上述程序時,輸出將是:

用槍攻擊
用劍攻擊
用刀攻擊

在以上程序中,我們創(chuàng)建了三個具有相同名稱的不同函數(shù)attack。但是,它接受不同的參數(shù)類型。這樣,記住 attack 名稱即可調(diào)用函數(shù)。

  • 調(diào)用 attack(with: Gun()) 將觸發(fā)函數(shù)內(nèi)部的  func attack(with weapon:Gun) 語句。

  • 調(diào)用 attack(with: Blade()) 將觸發(fā)函數(shù)內(nèi)部的  func attack(with weapon:Blade) 語句。

  • 調(diào)用 attack(with: Knife()) 將觸發(fā)函數(shù)內(nèi)部的 func attack(with weapon:Knife)  語句。

示例2:基于不同參數(shù)類型的函數(shù)重載

func output(x:Int) {
    print("int值是 \(x)")
}

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

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

當您運行上述程序時,輸出將是:

int值是 2
字符串值是 Swift

在上面的程序中,我們有兩個具有相同名稱和相同數(shù)量參數(shù)的函數(shù)output()。但是,第一個output()函數(shù)將整數(shù)作為參數(shù),第二個output()函數(shù)將String參數(shù)作為參數(shù)。

與示例1類似,

  • 調(diào)用 output(x: 2) 會觸發(fā)函數(shù)內(nèi)部的 func output(x:Int) 語句

  • 調(diào)用 output(x: "Swift") 會觸發(fā)函數(shù)內(nèi)部的 func output(x:String) 語句。

示例3:基于不同數(shù)量參數(shù)的函數(shù)重載

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!

在上面的程序中,該函數(shù)output()已根據(jù)參數(shù)數(shù)量重載。

第一個output()不帶參數(shù),第二個output()帶一個參數(shù):String,第三個output()帶兩個參數(shù):String和Int。

讓我們嘗試通過更改參數(shù)名稱來重載,但參數(shù)標簽保持不變,如下所示:

示例4:具有相同參數(shù)標簽的函數(shù)重載

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

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

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

當您運行上述程序時,輸出將是:

2
Hello

正如您看到的,在上面的程序中,可以對重載函數(shù)使用相同的參數(shù)標簽。但是,根據(jù)重載的要求,您必須具有不同數(shù)量的參數(shù)或不同類型的參數(shù)。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清