- Swift 5從零到精通iOS開發訓練營
- 張益琿編著
- 2205字
- 2022-07-27 18:32:12
5.1 函數的基本應用
在數學中,函數有3要素:定義域、對應關系和值域。在編程中,拋開函數的實現,在聲明函數時也有3要素:參數、返回值和函數名。參數和返回值決定函數的類型,參數數量和類型完全相同,同時返回值類型也相同的函數則為同類型函數。Swift語言中,使用func關鍵字來聲明函數,一個完整的函數聲明和實現應該符合如下格式:
func methodName(param1,param2,…)->returnValue{實現部分}
methodName需要編寫為函數名稱,之后跟的小括號中需要設置函數的參數類型和個數,多個參數使用逗號進行分割。參數列表后面使用符號“->”來連接返回值類型。至此,函數的聲明部分就完成了。如果要對函數進行實現,在后面追加大括號,里面為函數的實現代碼。如果一個函數沒有返回值,也可以將參數列表后面的部分省略。在調用函數時,直接使用函數名來進行調用。
5.1.1 函數的創建與調用
使用Xcode開發工具創建一個名為Function的Playground文件,在其中編寫如下示例代碼:

參數列表中的參數需要指定參數名和參數類型,也可以編寫無參的函數,為空即可,示例代碼如下:

如果函數不需要返回值,可以選擇返回Void或者直接省略返回值部分,示例代碼如下:

還有一種特殊情況,原則上函數的返回值只能有一個,在實際開發中,如果需要返回多個值,通常會采用復合類型來處理。在Objective-C語言中,由于不支持元組類型,要返回多個值時,會采用返回數組或者字典的方式。在Swift語言中,可以用元組來達到這樣的效果,模擬一個數據查詢的函數,這個函數將通過傳入一個數據ID來進行數據查詢操作,并返回查詢狀態和具體的數據,示例代碼如下:

Swift語言中的函數還有一個使用技巧,開發者可以通過返回Optional類型值來標識函數的執行是否成功,在調用函數時使用if-let結構進行安全性檢查,示例代碼如下:

5.1.2 關于函數的參數名
有編程經驗的讀者可能會發現各個編程語言有一些特點,以函數的參數名為例,在Objective-C中,實際上函數的參數名是隱含于函數名稱中的,示例如下:
//Objective-C語言中函數的風格 -(void)getDataFromDataID:(NSString*)dataID{ } //對函數進行調用 [self getDataFromDataID:@"1101"];
Objective-C這種風格的函數寫法有一個很大的優點,開發者在調用函數時,根據函數名中的信息就可以推斷出參數的意義,如以上代碼所示,getDataFromDataID很容易使開發者聯想到此參數需要傳遞數據的ID值。這里會產生一個問題,函數名將變得非常冗長,編碼界面將變得十分擁擠。在Java中,參數名是直接添加在參數列表中的,示例如下:
//Java語言中函數的風格 private void getMyData(String dataID){ } getMyData("1101");
通過比較Java與Objective-C的函數風格,可以發現Java語言簡練得多,但同時也有缺陷:在調用函數時,函數參數列表中的參數并沒有一個參數名標識,這樣開發者在調用函數或者檢查代碼時,不能一目了然地明白各個參數的意義。在參數很多的情況下,這個問題就變得尤為突出。
Swift語言中的函數風格借鑒了Objective-C與Java的優勢和劣勢,引入了參數的內部命名與外部命名概念。內部命名在函數實現時使用,外部命名在函數調用時使用。上面所有例子編寫的函數中,參數名都是內部命名,開發者若不設置參數的外部命名,則默認函數參數的外部命名與內部命名相同。因此開發者在調用函數時,傳入的參數前面都有一個參數名標注,示例如下:

在聲明函數時,也可以在內部命名的前面再添加一個名稱作為參數的外部命名,示例如下:

有了Swift中參數內部名稱與外部名稱的語法規則,開發者可以十分靈活地編寫函數。參數的外部名稱會在調用函數時標識參數,這樣既簡化了函數名,又能很好地幫助開發者理解每個參數的意義,并且這種語法的優勢在進行函數重載操作時會更大,在后面講解函數重載的章節中,讀者就能體會到。
Swift語言也支持省略函數參數的外部名稱,默認函數參數的外部名稱與內部名稱相同,開發者可以使用匿名變量標識符“_”來對外部名稱進行省略,示例如下:

5.1.3 函數中參數的默認值、不定數量參數與inout類型參數
在進行函數調用時,每個參數都必須要傳值,這句話其實并不十分準確,應該說每個參數都必須有值。除了在調用時為參數傳值外,Swift語言中函數的參數也支持設置默認值。需要注意的是,如果函數的某個參數設置了默認值,那么開發者在調用函數的時候,可以傳此參數的值,也可以不傳此參數的值,但是參數的位置要嚴格對應。示例如下:

在開發中還有一種情況也十分常見,有時候開發者需要編寫參數個數不定的函數,例如打印函數print(),其中傳入參數的數量就是不確定的。對于這類函數的編寫,Swift也對它做了很好的支持。編寫一個函數,傳入不定個數的整數值,打印其相加后的結果,示例代碼如下:

實際上,在Swift語言中,在某個參數類型的后面追加符號“…”,則會將此參數設置為數量可變。在函數內部,開發者傳遞的值會被包裝成一個集合類型賦值給對應參數。需要注意,傳遞的參數類型必須相同,并且可以傳遞多組數量可變的參數,不同參數之間參數類型可以不同,示例如下:

Swift語言支持設置函數參數的默認值,支持傳遞數量不定的參數,開發者在編寫代碼時靈活運用函數可以達到事半功倍的效果。
關于Swift語言的參數傳遞,還有這樣一個特點:傳遞的如果是值類型的參數,那么參數值在傳遞進函數內部時會將原值復制為一份常量,且在函數內不可以修改。關于值類型和引用類型的相關知識,后面章節會詳細介紹,這里讀者只需要了解:類屬于引用類型,而基本數據類型、枚舉和結構體都屬于值類型。對于值類型參數,如果開發者在函數內部修改參數的值,編譯器會直接報錯,示例代碼如下:
//錯誤示范 //func myFunc12(param:Int){ // param+=1 //}
如果在開發中真的需要在函數內部修改傳遞參數的變量的值,可以將此參數聲明為inout類型,示例代碼如下:

上面的演示代碼中將參數param聲明為inout類型,在傳參時需要使用“&”符號,這個符號將傳遞參數變量的內存地址。
- Cocos2D-X權威指南(第2版)
- Mastering ServiceStack
- Computer Vision for the Web
- 零起步玩轉掌控板與Mind+
- Machine Learning with R Cookbook(Second Edition)
- AngularJS Web Application Development Blueprints
- Raspberry Pi for Secret Agents(Third Edition)
- 深入淺出Android Jetpack
- MATLAB定量決策五大類問題
- Troubleshooting PostgreSQL
- Learning ELK Stack
- Apex Design Patterns
- 精通Linux(第2版)
- INSTANT Adobe Edge Inspect Starter
- TypeScript 2.x By Example