在本文中,您將了解函數(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ù)重載。根據(jù)定義,創(chuàng)建兩個或兩個以上具有相同名稱但傳遞的參數(shù)數(shù)量或類型不同的函數(shù)的過程稱為函數(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) 語句。
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) 語句。
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ù)標簽保持不變,如下所示:
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ù)。