Swift5-外行零基礎(chǔ)入門_10-函數(shù)(上)

函數(shù)

什么是函數(shù)?

你認(rèn)識(shí)了一個(gè)新朋友,她長(zhǎng)發(fā)飄飄,身材高挑,還有一雙烏黑的大眼睛!
但是,你不會(huì)每次都把新朋友的特點(diǎn)和細(xì)節(jié)都重新描述一遍,因?yàn)?,你給了她一個(gè)名稱。
你每次跟朋友提起她的時(shí)候,會(huì)說(shuō),我那位美女朋友,或者,她的名字叫西施!

我們用流程控制語(yǔ)句加上運(yùn)算符處理數(shù)據(jù),就已經(jīng)可以滿足大部分的任務(wù)要求了。
然而,僅僅這樣做,是遠(yuǎn)遠(yuǎn)不夠的。
比如,你寫了一段代碼,可以計(jì)算出一個(gè)圓的面積?,F(xiàn)在,這里有十幾個(gè)圓,半徑都不一樣,讓你分別計(jì)算它們的面積,最后計(jì)算出總面積,又怎么辦呢?每個(gè)圓都寫一段新的代碼嗎?顯然不是,我們不會(huì)容忍這么愚蠢的事情發(fā)生。

因此,函數(shù)就誕生了。
函數(shù)是對(duì)一段代碼的打包。舉個(gè)最簡(jiǎn)單的例子:

func greeting() {
    print("Hello")
}

這是一段最簡(jiǎn)單的函數(shù),它僅僅包含一行代碼??雌饋?lái)沒(méi)有必要,我大可以直接調(diào)用print("Hello")這段代碼,但是別急,我們?cè)谶@里只是想說(shuō)明函數(shù)的基本形式。
func表明,這是一個(gè)函數(shù);greeting是函數(shù)名,你可以任意定義;函數(shù)名后面緊跟著(),我們稍后解釋;大括號(hào)包裹起來(lái)的,是代碼段。
函數(shù)寫好之后,我們就可以在別的地方調(diào)用這段代碼,只需要寫greeting()就可以了。

greeting() 
// Hello

函數(shù)包裹起來(lái)的部分,可以任意加入合理的內(nèi)容,這樣,我們就可以把你加入的代碼整體對(duì)待。
我們常常說(shuō),不要把給人加標(biāo)簽,但是人類喜歡這樣做,因?yàn)檫@就是我們大腦的運(yùn)作方式。只有給一類事務(wù)加上標(biāo)簽,我們才能快速處理復(fù)雜的事務(wù)。
但是,如何加標(biāo)簽,是需要注意的問(wèn)題。比如,你說(shuō)那個(gè)胖子的時(shí)候,你實(shí)際上是把他的其中一個(gè)特點(diǎn)當(dāng)作了標(biāo)簽,在你運(yùn)用這個(gè)標(biāo)簽處理問(wèn)題的時(shí)候,容易被誤導(dǎo),從而產(chǎn)生錯(cuò)誤的結(jié)果。
因此,最好是給對(duì)象起個(gè)沒(méi)有實(shí)際干擾意義的標(biāo)簽名稱,比如姓名,職稱等。

函數(shù)的參數(shù)

顯然,這樣的函數(shù)缺乏靈活性,我們引入?yún)?shù)的概念,可以拓展這段函數(shù)的功能。

func greeting(text:String) {
    print(text)
}
greeting(text: "Hello")
greeting(text: "nihao")

注意這段代碼不同之處,函數(shù)名后面的()里,加入了一點(diǎn)東西。text是參數(shù)名,冒號(hào):后面指定了數(shù)據(jù)類型String,然后在下面包裹的執(zhí)行代碼中,我們可以直接引用text這個(gè)參數(shù)。
于是,我們?cè)俅握{(diào)用這段函數(shù)時(shí),小括號(hào)()中,用參數(shù)名text+冒號(hào):的形式,指定了參數(shù)的值。從而,完成了一段函數(shù)的調(diào)用。
如果在調(diào)用時(shí),給參數(shù)指定另外的值,就可以獲得不同的打印結(jié)果。
注意,Swift號(hào)稱是數(shù)據(jù)安全型的編程語(yǔ)言,就是說(shuō),我們要給數(shù)據(jù)指定具體的數(shù)據(jù)類型,我們之前在學(xué)習(xí)變量和常量時(shí)已經(jīng)掌握了類似的用法。這樣,可以避免混亂的數(shù)據(jù)類型造成的錯(cuò)誤。

函數(shù)的返回值

我們有必要先講解一下返回值這個(gè)概念。
函數(shù)的本質(zhì)是包裹一段代碼,然后達(dá)到復(fù)用的目的。但是,靜態(tài)的打包,復(fù)用性并不強(qiáng),因此我們輸入一些參數(shù),就可以適應(yīng)多種情況。有輸入,就有輸出,我們不能總是使用print,因?yàn)楹芏鄷r(shí)候,輸出的這個(gè)結(jié)果并不需要打印,而是送給下一個(gè)動(dòng)作,繼續(xù)處理。
因此,我們通常使用return,將函數(shù)的結(jié)果返回。
還需要注意一點(diǎn),既然要返回一個(gè)值,swift還要求我們將返回的類型指定清楚。
上面的兩個(gè)例子,我們用返回值的形式表達(dá),就是這樣:

func greeting() -> String {
    return "Hello"
}
print(greeting())

我們用->這個(gè)符號(hào)跟著一個(gè)數(shù)據(jù)類型String,表明我們這個(gè)函數(shù)要返回一個(gè)String類型的結(jié)果。我想將這個(gè)結(jié)果打印出來(lái)的話,就在外部使用print()函數(shù)。
我還可以繼續(xù)處理這個(gè)結(jié)果,比如這樣:let message = greeting() + " Tom" + "!",我們把greeting()看作一個(gè)獨(dú)立的數(shù)據(jù),加入到了另一個(gè)常量中。
這樣看來(lái),我們可以把函數(shù)類比成一條全自動(dòng)生產(chǎn)線,給它一些原料,最后出來(lái)一些成品。
比如:

輸入一頭活豬,輸出一堆香腸。
輸入一堆廢鐵,輸出一堆槍炮。

大概就是這么個(gè)意思來(lái)理解函數(shù)。

總結(jié)與預(yù)告

現(xiàn)在總結(jié)一下:函數(shù)的本質(zhì)是包裹起一段代碼,實(shí)現(xiàn)復(fù)用。為了更好的復(fù)用,可以傳遞參數(shù)進(jìn)去,然后返回某個(gè)值。需要注意,傳遞參數(shù)和返回值的時(shí)候,要說(shuō)清楚他們的數(shù)據(jù)類型,避免程序錯(cuò)誤,也是程序所要求的。

好的,關(guān)于函數(shù),這些是最基本的概念。還有很多知識(shí)點(diǎn),比如多參數(shù),給參數(shù)加標(biāo)簽,默認(rèn)參數(shù),可變參數(shù),輸入輸出參數(shù),多返回值,返回元組可選類型,函數(shù)類型,函數(shù)類型作為參數(shù)類型,函數(shù)類型作為返回類型,嵌套函數(shù)等。
是不是已經(jīng)暈了,其實(shí)如果你已經(jīng)理解了本節(jié)介紹的函數(shù)的基本概念,這些看上去五花八門的名字都好理解,我們把這些內(nèi)容放到下一節(jié)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容