swift文件筆記(六) -- 函式
1.多重返回值函式
你可以用元組(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, currentMax)
}
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
// 列印 "min is -6 and max is 109"
2.函式引數標籤和引數名稱
每個函式引數都有一個引數標籤( argument label )以及一個引數名稱( parameter name )。引數標籤在呼叫函 數的時候使用;呼叫的時候需要將函式的引數標籤寫在對應的引數前面。引數名稱在函式的實現中使用。預設情況下,函式引數使用引數名稱來作為它們的引數標籤。
指定引數標籤
你可以在函式名稱前指定它的引數標籤,中間以空格分隔:
func greet(person: String, from hometown: String) -> String {
return "Hello \(person)! Glad you could visit from \(hometown)."
} print(greet(person: "Bill", from: "Cupertino")) // 列印 "Hello Bill! Glad you could visit from Cupertino."
忽略引數標籤
如果你不希望為某個引數新增一個標籤,可以使用一個下劃線( _
func someFunction(_ firstParameterName: Int, secondParameterName: Int) { // 在函式體內,firstParameterName 和 secondParameterName 代表引數中的第一個和第二個引數值
}
someFunction(1, secondParameterName: 2)
預設引數值
你可以在函式體中通過給引數賦值來為任意一個引數定義預設值(Deafult Value)。當預設值被定義後,呼叫這個函式時可以忽略這個引數。將不帶有預設值的引數放在函式引數列表的最前,一般來說,沒有預設值的引數更加的重要。
func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) { // 如果你在呼叫時候不傳第二個引數,parameterWithDefault 會值為 12 傳入到函式體中。
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault = 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault = 12
3.可變引數
一個可變引數(variadic parameter)可以接受零個或多個值。函式呼叫時,你可以用可變引數來指定函式引數可以被傳入不確定數量的輸入值。通過在變數型別名後面加入( ... )的方式來定義可變引數。一個函式最多隻能擁有一個可變引數。
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5) // 返回 3.0, 是這 5 個數的平均數。 arithmeticMean(3, 8.25, 18.75) // 返回 10.0, 是這 3 個數的平均數。
4.輸入輸出引數
函式引數預設是常量。試圖在函式體中更改引數值將會導致編譯錯誤(compile-time error)。如果你想要一個函式可以修改引數的值,並且想要在這些修改在函式呼叫結束後仍然存在,那麼就應該把這個引數定義為輸入輸出引數(In-Out Parameters)。
在引數定義前加 inout 關鍵字,呼叫時在引數名前加&符。
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
}
swapTwoInts(&someInt, &anotherInt)
5.函式型別
每個函式都有特定的型別,由引數型別和返回值型別組成。
() -> Void ,叫“沒有引數,並返回 Void 型別的函式”。
(Int, Int) -> Int ,可以解讀為“這個函式型別有兩個 Int 型的引數並返回一個 Int 型的值。”。
可以用函式型別宣告常量變數,也能把函式型別作入參和返回值。
6.巢狀函式
到目前為止本章中你所見到的所有函式都叫全域性函式(global functions),它們定義在全域性域中。你也可以把函式定義在別的函式體中,稱作巢狀函式(nested functions)。
預設情況下,巢狀函式是對外界不可見的,但是可以被它們的外圍函式(enclosing function)呼叫。一個外圍函式也可以返回它的某一個巢狀函式,使得這個函式可以在其他域中被使用。