iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 10
0
Software Development

Swift 菜鳥的30天系列 第 10

Day-10 Swift 語法(6) - 動手做 Functions

  • 分享至 

  • xImage
  •  

Functions (函數,功能,方法)

中文翻譯實在太多種了搞的我好亂,所以都用 function 方便理解(雖然我都說方法,function 是一個獨立的程式碼區塊,用來執行自定義的功能。通過給 function 一個名字來定義它的功能,並且在需要的時候,通過這個呼叫這個 function 的名稱來執行它所定義的任務。


定義及調用 function

我覺得程式碼單純用述說的會說得天花亂墜,所以還是用程式碼圖解吧(絕對不是懶
https://ithelp.ithome.com.tw/upload/images/20171228/20107701jhjFNC45GS.png

我們定義一個叫做 customFunc 的 function,然後 (name: String, num: Int, drink: String) 是當你使用這個 function 時必須輸入的參數以及該類型,我們希望他返回一個 String 類型的值,所以我們將它在後面加上一個箭頭及 String ( -> String ),使他返回這個類型。

之後每次使用 customFunc 方法都會要求你輸入需要的參數
https://ithelp.ithome.com.tw/upload/images/20171228/20107701e74O57e0RV.png


functions 的參數及回傳值

function 中的參數跟傳回值非常靈活,你可以輕鬆定義一個簡單的 function 或是那種需要多種不同型別參數的複雜 function ,完全靠開發者的需求來定義 function 所需參數。

無形式參數的 functions

函數沒有要求必須輸入一個參數,你也可以讓他單純是一個回傳 String 類型的值。
https://ithelp.ithome.com.tw/upload/images/20171228/20107701uvvslrtHHx.png

即使這個 function 不需要輸入參數,但還是必須在 function 後面加上圓括號 ()

多形式參數的 functions

function 可以輸入多個形式參數,可以寫在後面的圓括號()內,用逗號將他們分隔,如前面的範例。
https://ithelp.ithome.com.tw/upload/images/20171228/20107701Ynra6tgEBb.png

這是一個判斷某人有沒有帶鑰匙以及帶了多少人進來,設了一個類型為 bool 的key,來判斷有沒有帶鑰匙,如果有帶鑰匙(true),則執行 if 中的第一段程式碼,若忘了帶鑰匙(false)則執行 else 中的程式碼。

https://ithelp.ithome.com.tw/upload/images/20171228/20107701TXaYFdJQwa.png

無返回值的函數

你也可以不去設定他的返回值,直接透過 function 執行,將結果 print 出。
https://ithelp.ithome.com.tw/upload/images/20171228/20107701YZoiSdJVRf.png

嚴格來講,無返回值的 function 還是有一個返回值的,儘管沒有定義它,實際上它會返回一個特殊的類型 Void。它其實是一個空的元組,作用相當於沒有元素的元組,可以寫作 ( )。雖然說可以不用定義返回值,但如果你定義一個需要返回值 function 的時候就必須返回。如果返回值的話就會產生錯誤。
https://ithelp.ithome.com.tw/upload/images/20171228/20107701Dp2LH9Qr5w.png
return String
https://ithelp.ithome.com.tw/upload/images/20171228/20107701J3D3O5Gtq1.png

多返回值的函數

當你可能需要兩種回傳值的時候,例如像是我們進行一個除法運算不只希望能得到他的商,還希望他可以得到後面的餘數,這時我們就會需要程式碼返回兩個值給我們,這時候就再返回值後面加上括號,像是下面的我們範例中的 -> (result:Int, other:Int)。
https://ithelp.ithome.com.tw/upload/images/20171229/20107701FQqGE8QCom.png

返回 Optional

當然你也可以返回一個 Optional 的值,你可以定義其中一個參數或是整個元組,讓他在沒有值得時候返回 nil 。如果需要包含整個元組,只需要在圓括號後加上 "?" 來說明 Optional 。

https://ithelp.ithome.com.tw/upload/images/20171229/20107701KOezYQhMMO.png


functions 實際參數標籤和形式參數名

指定實際參數標籤

我們也可以幫參數上一個標籤使他方便理解和可讀性,在此我為 name 上一個 username的標籤,wallet 則是 money 的標籤,當我們在使用 func 時的參數名稱為參數的標籤名稱。
https://ithelp.ithome.com.tw/upload/images/20171229/201077010T0zpjXyWb.png

省略參數標籤

我們可以在參數前面加上一個底線 ( _ ),讓他省略這個參數標籤,使用 function 的時候直接到逗號後面輸入所屬的類型值即可。
https://ithelp.ithome.com.tw/upload/images/20171229/201077010kiVn0eGSM.png

參數加入默認值

我們可以在建立 function 時,就在他後方加入一個默認值,讓他在參數沒有輸入值的時候能產生預設值的資訊,當然在你為 function 輸入所需類型的值之後,會顯示輸入值的結果。

加入默認值
https://ithelp.ithome.com.tw/upload/images/20171229/20107701PZjXUd4IqO.png

加入默認值之後使用參數
https://ithelp.ithome.com.tw/upload/images/20171229/20107701SQtHgeU9mw.png

有了默認值之後,也可以只用其中一樣參數就好
https://ithelp.ithome.com.tw/upload/images/20171229/20107701sjvN4twAcL.png

可變形式參數

可變形式參數可以接受零或者多個特定類型的值。當使用 function 的時候你可以使用它來聲明形式參數可以被傳入值的數量是可變的。透過在形式參數的類型名稱後邊插入三個點( ... )來書寫可變形式參數。

https://ithelp.ithome.com.tw/upload/images/20171229/20107701A3z5Uzuoe9.png

我們經由輸入的 numbers 中類型為 Int 的常數數組來計算其平均值,先算出 Int... 數組中的總和並儲存到 total 中,並用 count 計算 Int... 的項目數量當成除數來除以 total。

https://ithelp.ithome.com.tw/upload/images/20171229/20107701BWgpyFdHMv.png

一個 function 中最多只能有一個可變形式參數。

in-out 參數

可變形式參數只能在 function 的內部做改變。如果你想 function 能夠修改一個形式參數的值,而且你想這些改變在 function 結束之後依然生效,那麼就需要將形式參數定義為 in-out 形式參數。在定義函數前,我們在前面添加一個 inout 關鍵字可以定義一個 in-out 形式參數。 in-out 形式參數有一個能輸入給 function 的值,function 能對其進行修改,還能輸出到函數外邊替換原來的值。

你只能使用變數作為 in-out 形式參數的實際參數。你不能用常數或者字串作為實際參數,因為他們不能被修改。

https://ithelp.ithome.com.tw/upload/images/20171229/20107701jctiYMV2kQ.png

在將變數作為實際參數傳遞給 in-out 形式參數的時候,直接在它前邊加一個( & )來表示可以被 function 修改。像是上述中的 addTest(num1: &numberA, num2: &numberB),直接將 number A,B 中的值傳進 function 中使用。

in-out 形式參數與函數的返回值不同。上面的例子沒有去定義返回類型和返回值,但它仍然能修改我們 numberA,B中的值。


上一篇
Day-09 Swift 語法(5) - 被控制的Control flow—轉換控制流
下一篇
Day-11 Swift 語法(7) - Functions 類型
系列文
Swift 菜鳥的30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言