一. swift函數(shù)允許用元組作為返回值蜂林,以達(dá)到函數(shù)返回多個值的目的吞杭。
// 用元祖作為函數(shù)返回值
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)
}
注意點(diǎn):
- minMax函數(shù)返回了一個包含兩個 Int 值的元組稚矿。但是函數(shù)不會對傳入數(shù)組執(zhí)行任何安全檢查,如果 array 參數(shù)是一個空數(shù)組骚勘,那么minMax在試圖訪問 array[0] 時會觸發(fā)一個運(yùn)行時錯誤(runtime error)隘膘。為了安全地處理這個“空數(shù)組”問題疑故,將 minMax(_:) 函數(shù)改寫為使用可選元組返回類型,并且當(dāng)數(shù)組為空時返回 nil弯菊;寫法如下:
func minMax(array: [Int]) -> (min: Int, max: Int?) { ... }
- 由于元組的成員值已被命名纵势,所以可以通過點(diǎn)語法來檢索到最小值或最大值,并且元祖的成員不需要在元祖從函數(shù)中返回時命名管钳,因為它們的名字已經(jīng)在函數(shù)返回類型中指定了钦铁。
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
二. 函數(shù)的參數(shù)
每個函數(shù)的參數(shù)都有一個參數(shù)標(biāo)簽(Argument Label)以及參數(shù)名稱(Parateter Name)。不指定的情況下才漆,參數(shù)名稱就是函數(shù)參數(shù)的參數(shù)標(biāo)簽牛曹。
參數(shù)名稱在函數(shù)實(shí)現(xiàn)中使用;
參數(shù)標(biāo)簽在函數(shù)調(diào)用時使用醇滥;
參數(shù)標(biāo)簽寫在參數(shù)名稱前面黎比,以空格分開。
一個函數(shù)中多個參數(shù)的參數(shù)名稱唯一腺办,參數(shù)標(biāo)簽可重復(fù)焰手,但不推薦。
1. 參數(shù)標(biāo)簽使用:讓函數(shù)類似自然語言怀喉,提高了可讀性书妻。
func foo(person name: String, from hometown: String) {
print(name)
}
foo(person: "lzf", from: "china")
2. 忽略參數(shù)標(biāo)簽:如果想隱藏(忽略)參數(shù)標(biāo)簽,用下劃線_代替躬拢。
func someFunc(_ age: Int, height: Double) {}
someFunc(20, height: 178)
3. 默認(rèn)參數(shù)值:通過給參數(shù)賦值定義默認(rèn)參數(shù)值躲履,函數(shù)調(diào)用時可忽略此參數(shù)。
也可以對此參數(shù)重新賦值聊闯,調(diào)用函數(shù)時會出現(xiàn)兩個函數(shù)提示工猜!
一般將帶有默認(rèn)值的參數(shù)放在最后,函數(shù)調(diào)用時語意更清晰菱蔬。如下:
func someFunc(height: Double, age: Int = 20) {}
someFunc(height: 178)
// 或者
someFunc(height: 180, age: 18)
4. 可變參數(shù):一個可變參數(shù)可以接收零個或多個值篷帅。
通過在變量類型名后加...來定義可變參數(shù)史侣,
可變參數(shù)的傳入值在函數(shù)體中變?yōu)榇祟愋偷臄?shù)組。
注意:一個函數(shù)中只能有一個可變參數(shù)魏身。
// 計算一組任意長度數(shù)字的算術(shù)平均值
func average(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
average(1, 2, 37, 48, 19, 199)
輸入輸出參數(shù):函數(shù)參數(shù)默認(rèn)是常量惊橱。試圖在函數(shù)體中更改參數(shù)值將會導(dǎo)致編譯錯誤(compile-time error)。這意味著你不能錯誤地更改參數(shù)值箭昵。如果你想要一個函數(shù)可以修改參數(shù)的值税朴,并且想要在這些修改在函數(shù)調(diào)用結(jié)束后仍然存在,那么就應(yīng)該把這個參數(shù)定義為輸入輸出參數(shù)(In-Out Parameters)家制。
定義一個輸入輸出參數(shù)時正林,在參數(shù)定義前加 inout 關(guān)鍵字。一個輸入輸出參數(shù)有傳入函數(shù)的值颤殴,這個值被函數(shù)修改觅廓,然后被傳出函數(shù),替換原來的值诅病。想獲取更多的關(guān)于輸入輸出參數(shù)的細(xì)節(jié)和相關(guān)的編譯器優(yōu)化哪亿,請查看輸入輸出參數(shù)一節(jié)。
你只能傳遞變量給輸入輸出參數(shù)贤笆。你不能傳入常量或者字面量(literal value),因為這些量是不能被修改的讨阻。當(dāng)傳入的參數(shù)作為輸入輸出參數(shù)時芥永,需要在參數(shù)名前加 & 符,表示這個值可以被函數(shù)修改钝吮。
注意:輸入輸出參數(shù)不能有默認(rèn)值埋涧,而且可變參數(shù)不能用 inout 標(biāo)記!F媸荨棘催!
5. 輸入輸出參數(shù):在變量名前面加 inout 關(guān)鍵字
// 定義函數(shù)交換兩個整型變量的值
func swapInts(_ a: inout Int, _ b: inout Int) {
let tempA = a
a = b
b = tempA
}
var intA = 3
var intB = 120
swapInts(&intA, &intB)
print("intA = \(intA)\nintB = \(intB) ")
上面的例子中,intA和intB的原始值在函數(shù)中被修改了耳标,盡管他們定義在函數(shù)體外醇坝。注意:輸入輸出參數(shù)和函數(shù)返回值時不一樣的。上面的函數(shù)并沒有定義返回值次坡。所以呼猪,輸入輸出參數(shù)是函數(shù)對函數(shù)體外的變量產(chǎn)生影響的方式之一。
三. 函數(shù)的類型
在swift中砸琅,使用函數(shù)類型就像使用其他類型一樣宋距。你可以定義一個類型為函數(shù)的常量或變量,并將相同類型的函數(shù)賦值給它:
func add(_ a: Int, _ b: Int) -> Int { // 加法
return a + b
}
func multiply(_ a: Int, _ b: Int) -> Int { // 乘法
return a + b
}
// 1.將add函數(shù)賦值給函數(shù)變量mathFunc
var mathFunc: (Int, Int) -> Int = add
// 2.然后用mathFunc調(diào)用add函數(shù)
mathFunc(10, 20)
// 3.也可以將multiply函數(shù)賦值給mathFunc症脂,因為它們函數(shù)類型一樣
mathFunc = multiply
mathFunc(10, 20)
// 4.和其他類型一樣谚赎,將函數(shù)賦值給一個常量或變量時淫僻,swift會自動推導(dǎo)類型:
let anotherMathFunc = add // 被推導(dǎo)為(Int, Int) -> Int類型函數(shù)