Swift 函數(shù)用來完成特定任務(wù)的獨(dú)立的代碼塊。
Swift使用一個(gè)統(tǒng)一的語法來表示簡單的C語言風(fēng)格的函數(shù)到復(fù)雜的Objective-C語言風(fēng)格的方法。
函數(shù)聲明: 告訴編譯器函數(shù)的名字,返回類型及參數(shù)。
函數(shù)定義: 提供了函數(shù)的實(shí)體。
Swift 函數(shù)包含了參數(shù)類型及返回值類型:
Swift 定義函數(shù)使用關(guān)鍵字 func。
定義函數(shù)的時(shí)候,可以指定一個(gè)或多個(gè)輸入?yún)?shù)和一個(gè)返回值類型。
每個(gè)函數(shù)都有一個(gè)函數(shù)名來描述它的功能。通過函數(shù)名以及對應(yīng)類型的參數(shù)值來調(diào)用這個(gè)函數(shù)。函數(shù)的參數(shù)傳遞的順序必須與參數(shù)列表相同。
函數(shù)的實(shí)參傳遞的順序必須與形參列表相同,-> 后定義函數(shù)的返回值類型。
func funcname(形參) -> returntype { Statement1 Statement2 …… Statement N return parameters }
以下我們定義了一個(gè)函數(shù)名為 youj 的函數(shù),形參的數(shù)據(jù)類型為 String,返回值也為 String:
import Cocoa func youj(site: String) -> String { return site } print(youj("www.o2fo.com"))
以上程序執(zhí)行輸出結(jié)果為:
www.o2fo.com
我們可以通過函數(shù)名以及對應(yīng)類型的參數(shù)值來調(diào)用函數(shù),函數(shù)的參數(shù)傳遞的順序必須與參數(shù)列表相同。
以下我們定義了一個(gè)函數(shù)名為 youj 的函數(shù),形參 site 的數(shù)據(jù)類型為 String,之后我們調(diào)用函數(shù)傳遞的實(shí)參也必須 String 類型,實(shí)參傳入函數(shù)體后,將直接返回,返回的數(shù)據(jù)類型為 String。
import Cocoa func youj(site: String) -> String { return site } print(youj("www.o2fo.com"))
以上程序執(zhí)行輸出結(jié)果為:
www.o2fo.com
函數(shù)可以接受一個(gè)或者多個(gè)參數(shù),我們也可以使用元組(tuple)向函數(shù)傳遞一個(gè)或多個(gè)參數(shù):
import Cocoa func mult(no1: Int, no2: Int) -> Int { return no1*no2 } print(mult(2, no2:20)) print(mult(3, no2:15)) print(mult(4, no2:30))
以上程序執(zhí)行輸出結(jié)果為:
40 45 120
我們可以創(chuàng)建不帶參數(shù)的函數(shù)。
func funcname() -> datatype { return datatype }
import Cocoa func sitename() -> String { return "W3Cschool教程" } print(sitename())
以上程序執(zhí)行輸出結(jié)果為:
W3Cschool教程
函數(shù)返回值類型可以是字符串,整型,浮點(diǎn)型等。
元組與數(shù)組類似,不同的是,元組中的元素可以是任意類型,使用的是圓括號。
你可以用元組(tuple)類型讓多個(gè)值作為一個(gè)復(fù)合值從函數(shù)中返回。
下面的這個(gè)例子中,定義了一個(gè)名為minMax(_:)的函數(shù),作用是在一個(gè)Int數(shù)組中找出最小值與最大值。
import Cocoa 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([8, -6, 2, 109, 3, 71]) print("最小值為 \(bounds.min) ,最大值為 \(bounds.max)")
minMax(_:)函數(shù)返回一個(gè)包含兩個(gè)Int值的元組,這些值被標(biāo)記為min和max,以便查詢函數(shù)的返回值時(shí)可以通過名字訪問它們。
以上程序執(zhí)行輸出結(jié)果為:
最小值為 -6 ,最大值為 109
如果你不確定返回的元組一定不為nil,那么你可以返回一個(gè)可選的元組類型。
你可以通過在元組類型的右括號后放置一個(gè)問號來定義一個(gè)可選元組,例如(Int, Int)?或(String, Int, Bool)?
注意
可選元組類型如(Int, Int)?
與元組包含可選類型如(Int?, Int?)
是不同的.可選的元組類型,整個(gè)元組是可選的,而不只是元組中的每個(gè)元素值。
前面的minMax(_:)
函數(shù)返回了一個(gè)包含兩個(gè)Int
值的元組。但是函數(shù)不會對傳入的數(shù)組執(zhí)行任何安全檢查,如果array
參數(shù)是一個(gè)空數(shù)組,如上定義的minMax(_:)
在試圖訪問array[0]
時(shí)會觸發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤。
為了安全地處理這個(gè)"空數(shù)組"問題,將minMax(_:)
函數(shù)改寫為使用可選元組返回類型,并且當(dāng)數(shù)組為空時(shí)返回nil
:
import Cocoa 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, currentMax) } if let bounds = minMax([8, -6, 2, 109, 3, 71]) { print("最小值為 \(bounds.min),組大值為 \(bounds.max)") }
以上程序執(zhí)行輸出結(jié)果為:
最小值為 -6,組大值為 109
下面是 youj(_:) 函數(shù)的另一個(gè)版本,這個(gè)函數(shù)接收W3Cschool教程官網(wǎng)網(wǎng)址參數(shù),沒有指定返回值類型,并直接輸出 String 值,而不是返回它:
import Cocoa func youj(site: String) { print("W3Cschool教程官網(wǎng):\(site)") } youj("http://www.o2fo.com")
以上程序執(zhí)行輸出結(jié)果為:
W3Cschool教程官網(wǎng):http://www.o2fo.com
函數(shù)參數(shù)都有一個(gè)外部參數(shù)名和一個(gè)局部參數(shù)名。
局部參數(shù)名在函數(shù)的實(shí)現(xiàn)內(nèi)部使用。
func sample(number: Int) { println(number) }
以上實(shí)例中 number 為局部參數(shù)名,只能在函數(shù)體內(nèi)使用。
import Cocoa func sample(number: Int) { print(number) } sample(1) sample(2) sample(3)
以上程序執(zhí)行輸出結(jié)果為:
1 2 3
你可以在局部參數(shù)名前指定外部參數(shù)名,中間以空格分隔,外部參數(shù)名用于在函數(shù)調(diào)用時(shí)傳遞給函數(shù)的參數(shù)。
如下你可以定義以下兩個(gè)函數(shù)參數(shù)名并調(diào)用它:
import Cocoa func pow(firstArg a: Int, secondArg b: Int) -> Int { var res = a for _ in 1..<b { res = res * a } print(res) return res } pow(firstArg:5, secondArg:3)
以上程序執(zhí)行輸出結(jié)果為:
125
注意
如果你提供了外部參數(shù)名,那么函數(shù)在被調(diào)用時(shí),必須使用外部參數(shù)名。
可變參數(shù)可以接受零個(gè)或多個(gè)值。函數(shù)調(diào)用時(shí),你可以用可變參數(shù)來指定函數(shù)參數(shù),其數(shù)量是不確定的。
可變參數(shù)通過在變量類型名后面加入(...)的方式來定義。
import Cocoa func vari<N>(members: N...){ for i in members { print(i) } } vari(4,3,5) vari(4.5, 3.1, 5.6) vari("Google", "Baidu", "W3CSchool")
以上程序執(zhí)行輸出結(jié)果為:
4 3 5 4.5 3.1 5.6 Google Baidu W3CSchool
一般默認(rèn)在函數(shù)中定義的參數(shù)都是常量參數(shù),也就是這個(gè)參數(shù)你只可以查詢使用,不能改變它的值。
如果想要聲明一個(gè)變量參數(shù),可以在參數(shù)定義前加上inout關(guān)鍵字,這樣就可以改變這個(gè)參數(shù)的值了。
例如:
func getName(_name: inout Sting).....
此時(shí)這個(gè)name值可以在函數(shù)中改變。
一般默認(rèn)的參數(shù)傳遞都是傳值調(diào)用的,而不是傳引用。所以傳入的參數(shù)在函數(shù)內(nèi)改變,并不影響原來的那個(gè)參數(shù)。傳入的只是這個(gè)參數(shù)的副本。
當(dāng)傳入的參數(shù)作為輸入輸出參數(shù)時(shí),需要在參數(shù)名前加&符號,表示這個(gè)值可以被函數(shù)修改。
實(shí)例:
func swapTwoInts(_a: inout Int, _b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var x = 1
var y = 5
swapTwoInts(&X, &y)
print("x 現(xiàn)在的值\(x),y 現(xiàn)在的值\(y)")
swapTwoInts(::)函數(shù)簡單地交換a與b的值。該函數(shù)先將a的值存到一個(gè)臨時(shí)的常量tempoaryA中,然后將b的值賦給a,最后將tempoaryA賦值給b。
需要注意的是,someInt個(gè)anotherInt在傳入swapTwoInts(
::)函數(shù)前,都加了&的前綴。
以上程序執(zhí)行結(jié)果為:
x 現(xiàn)在的值 5,y 現(xiàn)在的值 1
更多建議: