Function是用來處理特別任務的一垞程式碼。我們會幫function取一個名字來表明他要做什麼事,並且呼叫他去執行我們需要做的事情。 Function可以依需求來決定是否代入參數;每個function都有一個型態,並可回傳本身的型態給呼叫他的程式碼。
Defining and Calling Functions
當我們定義一個function時,可以定義一個或多個輸入的參數名稱,以及輸出的型態名(可有可無)。
當我們給function參數時,參數的型態跟順序要跟當時定義好的function 一樣。
我們先試著定義一個function叫 sayHi(_:),我們會輸入使用者名字(String type)以及輸出一組打招呼的字串(String type):
func sayHi(personName: String) -> String {
let greeting = "Hello" + personName + "!"
return greeting
}
上面的例子來看,function的參數會寫在名稱後的()內,回傳型態則是寫在->之後。
如果我們不需要輸入參數,()內可不填;如果我們不需要回傳型態,->可不寫。
提醒一點,若是我們沒有回傳型態時,function 實際上仍然會有一個回傳型態,叫做Void。他是一個空的tuple,裡面沒有任何參數,也可以寫成()。
回傳值若是用不到我們也可以不用理他,不過若是我們有可能會有回傳值的話,還是要記得在最後回傳,不然會有問題。
若是function需要回傳多個數值,可以利用tuple:
func minMax(array: [Int]) ->(min: Int, max: Int) {
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, cuttentMax)
}
上面的例子是將陣列裡的數字取出最大及最小,並回傳出去;當我們執行這個function時,接到的型態便是tuple:
let bounds = minMax([1, 40, -99, 74, 12])
print("min is \(bounds.min) and max is \(bounds.max)")
而且tuple參數的名稱就是function 裡定義好的變數名稱
當我們的回傳型態為tuple但不一定有值會回傳的話,我們可以使用optional tuple 做為return type;以上面的例子來看,若是輸入的陣列是空的,執行起來就會出問題,因此改寫為:
func minMax(array: [Int]) ->(min: Int, max: Int)? {
if array.isEmpty {return nil}
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, cuttentMax)
}
Function Parameter Names
上面的一些例子,我們在呼叫function時的長相:
sayHi("Toby")
minMax([1, 3, 2, 4, 5])
若今天是多個參數代入時,比較難看出要代入的是什麼東西。
其實參數有兩種名字,一個是external parameter name,一個是local parameter name。
external parameter name 用來標示代入function的參數名稱;
local parameter name 則是在function實際上執行的名稱。
若我們沒有特別寫的話,第一個參數裡的external parameter name 是被省略的,第二個以及之後的參數會將local parameter name 當成external parameter name。
func myFunction(firstParaName: Int, secondParaName: Int) {
}
myFunction(1, secondParaName: 2)
呼叫的時候就會變成上面這個樣子。
Specifying External Parameter Names
當我們需要更易讀的function 時,可以定義好參數的兩個名稱:
func myFunction(externalParameterName localParameterName: Int) {
}
以剛剛sayHi的例子來改寫:
func sayHi(to person: String, and anotherPerson: String) -> String {
return "Hello \(person) and \(anotherPerson)"
}
print(sayHi(to: "Eason", and: "Jacklen"))
當我們呼叫sayHi時,可以很直白的看出來這個function大約會做什麼事。
若是我們要將第二個以後的參數external parameter name省略,在local parameter name 前面加個底線就可以了:
func myFunction(firstParaName: Int, _ secondParaName: Int) {
}
myFunction(1, 2)