中文翻譯實在太多種了搞的我好亂,所以都用 function 方便理解(雖然我都說方法,function 是一個獨立的程式碼區塊,用來執行自定義的功能。通過給 function 一個名字來定義它的功能,並且在需要的時候,通過這個呼叫這個 function 的名稱來執行它所定義的任務。
我覺得程式碼單純用述說的會說得天花亂墜,所以還是用程式碼圖解吧(絕對不是懶
我們定義一個叫做 customFunc 的 function,然後 (name: String, num: Int, drink: String) 是當你使用這個 function 時必須輸入的參數以及該類型,我們希望他返回一個 String 類型的值,所以我們將它在後面加上一個箭頭及 String ( -> String ),使他返回這個類型。
之後每次使用 customFunc 方法都會要求你輸入需要的參數
function 中的參數跟傳回值非常靈活,你可以輕鬆定義一個簡單的 function 或是那種需要多種不同型別參數的複雜 function ,完全靠開發者的需求來定義 function 所需參數。
函數沒有要求必須輸入一個參數,你也可以讓他單純是一個回傳 String 類型的值。
即使這個 function 不需要輸入參數,但還是必須在 function 後面加上圓括號 ()
function 可以輸入多個形式參數,可以寫在後面的圓括號()內,用逗號將他們分隔,如前面的範例。
這是一個判斷某人有沒有帶鑰匙以及帶了多少人進來,設了一個類型為 bool 的key,來判斷有沒有帶鑰匙,如果有帶鑰匙(true),則執行 if 中的第一段程式碼,若忘了帶鑰匙(false)則執行 else 中的程式碼。
你也可以不去設定他的返回值,直接透過 function 執行,將結果 print 出。
嚴格來講,無返回值的 function 還是有一個返回值的,儘管沒有定義它,實際上它會返回一個特殊的類型 Void。它其實是一個空的元組,作用相當於沒有元素的元組,可以寫作 ( )。雖然說可以不用定義返回值,但如果你定義一個需要返回值 function 的時候就必須返回。如果返回值的話就會產生錯誤。
return String
當你可能需要兩種回傳值的時候,例如像是我們進行一個除法運算不只希望能得到他的商,還希望他可以得到後面的餘數,這時我們就會需要程式碼返回兩個值給我們,這時候就再返回值後面加上括號,像是下面的我們範例中的 -> (result:Int, other:Int)。
當然你也可以返回一個 Optional 的值,你可以定義其中一個參數或是整個元組,讓他在沒有值得時候返回 nil 。如果需要包含整個元組,只需要在圓括號後加上 "?" 來說明 Optional 。
我們也可以幫參數上一個標籤使他方便理解和可讀性,在此我為 name 上一個 username的標籤,wallet 則是 money 的標籤,當我們在使用 func 時的參數名稱為參數的標籤名稱。
我們可以在參數前面加上一個底線 ( _ ),讓他省略這個參數標籤,使用 function 的時候直接到逗號後面輸入所屬的類型值即可。
我們可以在建立 function 時,就在他後方加入一個默認值,讓他在參數沒有輸入值的時候能產生預設值的資訊,當然在你為 function 輸入所需類型的值之後,會顯示輸入值的結果。
加入默認值
加入默認值之後使用參數
有了默認值之後,也可以只用其中一樣參數就好
可變形式參數可以接受零或者多個特定類型的值。當使用 function 的時候你可以使用它來聲明形式參數可以被傳入值的數量是可變的。透過在形式參數的類型名稱後邊插入三個點( ... )來書寫可變形式參數。
我們經由輸入的 numbers 中類型為 Int 的常數數組來計算其平均值,先算出 Int... 數組中的總和並儲存到 total 中,並用 count 計算 Int... 的項目數量當成除數來除以 total。
一個 function 中最多只能有一個可變形式參數。
可變形式參數只能在 function 的內部做改變。如果你想 function 能夠修改一個形式參數的值,而且你想這些改變在 function 結束之後依然生效,那麼就需要將形式參數定義為 in-out 形式參數。在定義函數前,我們在前面添加一個 inout 關鍵字可以定義一個 in-out 形式參數。 in-out 形式參數有一個能輸入給 function 的值,function 能對其進行修改,還能輸出到函數外邊替換原來的值。
你只能使用變數作為 in-out 形式參數的實際參數。你不能用常數或者字串作為實際參數,因為他們不能被修改。
在將變數作為實際參數傳遞給 in-out 形式參數的時候,直接在它前邊加一個( & )來表示可以被 function 修改。像是上述中的 addTest(num1: &numberA, num2: &numberB),直接將 number A,B 中的值傳進 function 中使用。
in-out 形式參數與函數的返回值不同。上面的例子沒有去定義返回類型和返回值,但它仍然能修改我們 numberA,B中的值。