swift5.3-day05--函數(shù)

1、定義函數(shù)

函數(shù)使我們可以重復(fù)使用代碼稳捆,這意味著我們可以編寫一個(gè)函數(shù)來做一些有趣的事情赠法,然后在很多地方運(yùn)行該函數(shù)

Swift函數(shù)以func關(guān)鍵字開頭,然后是函數(shù)名稱乔夯,然后打開和關(guān)閉括號(hào)砖织。函數(shù)的所有主體(應(yīng)在請(qǐng)求函數(shù)時(shí)運(yùn)行的代碼)都放在花括號(hào)內(nèi)。

func printHelp() {
    let message = """
Welcome to MyApp!
Run this app inside a directory of images and
MyApp will resize them all into thumbnails
"""

printHelp()

2末荐、傳入?yún)?shù)

func square(number: Int) {
    print(number * number)
}

square(number: 8)

3侧纯、返回值

func square(number: Int) -> Int {
    return number * number
}
let result = square(number: 8)
print(result)

4、參數(shù)標(biāo)簽

Swift讓我們?yōu)槊總€(gè)參數(shù)提供了兩個(gè)名稱:一個(gè)在調(diào)用函數(shù)時(shí)在外部使用甲脏,另一個(gè)在函數(shù)內(nèi)部在內(nèi)部使用眶熬。這就像寫兩個(gè)用空格隔開的名字一樣簡單。

func sayHello(to name: String) {
    print("Hello, \(name)!")
}

參數(shù)稱為to name块请,這意味著從外部調(diào)用to娜氏,但在內(nèi)部稱為name。這在函數(shù)內(nèi)部為變量賦予了一個(gè)合理的名稱负乡,但意味著調(diào)用該函數(shù)的方式自然而然:

sayHello(to: "Taylor")

_對(duì)于您的外部參數(shù)名稱牍白,使用下劃線可以在您自己的函數(shù)中獲得相同的行為脊凰,如下所示:

func greet(_ person: String) {
    print("Hello, \(person)!")
}
greet("Taylor")

5抖棘、默認(rèn)參數(shù)

您可以為自己的參數(shù)提供默認(rèn)值,只需=在其類型后寫一個(gè)“” 狸涌,然后輸入要提供的默認(rèn)值即可切省。因此,我們可以編寫一個(gè)greet()函數(shù)

func greet(_ person: String, nicely: Bool = true) {
    if nicely == true {
        print("Hello, \(person)!")
    } else {
        print("Oh no, it's \(person) again...")
    }
}
//可以通過兩種方式進(jìn)行調(diào)用:
greet("Taylor")
greet("Taylor", nicely: false)

6帕胆、可變函數(shù)

某些函數(shù)是可變參數(shù)朝捆,這是一種很好的說法,它們可以接受任意數(shù)量的相同類型的參數(shù)懒豹。該print()函數(shù)實(shí)際上是可變參數(shù):如果您傳遞許多參數(shù)芙盘,它們將全部打印在一行上,并在它們之間留有空格:

print("Haters", "gonna", "hate")

您可以通過...在其類型之后寫入來使任何參數(shù)可變脸秽。因此儒老,Int參數(shù)是單個(gè)整數(shù),而是Int...零個(gè)或多個(gè)整數(shù)-可能是數(shù)百個(gè)记餐。

func square(numbers: Int...) {
    for number in numbers {
        print("\(number) squared is \(number * number)")
    }
}

現(xiàn)在我們可以通過用逗號(hào)分隔它們來使用大量數(shù)字:

square(numbers: 1, 2, 3, 4, 5)

7驮樊、throw、do-catch

有時(shí),函數(shù)由于輸入錯(cuò)誤或內(nèi)部出錯(cuò)而失敗囚衔。Swift讓我們從函數(shù)中拋出錯(cuò)誤挖腰,方法是將它們標(biāo)記為throws返回類型之前的錯(cuò)誤,然后throw在出現(xiàn)問題時(shí)使用關(guān)鍵字练湿。

首先猴仑,我們需要定義一個(gè)enum描述我們可能拋出的錯(cuò)誤的。這些必須始終基于Swift的現(xiàn)有Error類型肥哎。我們將編寫一個(gè)檢查密碼是否正確的函數(shù)宁脊,因此,如果用戶嘗試使用明顯的密碼贤姆,則會(huì)拋出錯(cuò)誤:

enum PasswordError: Error {
    case obvious
}
func checkPassword(_ password: String) throws -> Bool {
    if password == "password" {
        throw PasswordError.obvious
    }

    return true
}

Swift不希望程序運(yùn)行時(shí)發(fā)生錯(cuò)誤榆苞,這意味著它不會(huì)讓您意外地運(yùn)行引發(fā)錯(cuò)誤的函數(shù)。

相反霞捡,您需要使用三個(gè)新的關(guān)鍵字來調(diào)用這些函數(shù):do開始一段可能引起問題的代碼坐漏,try在每個(gè)可能引發(fā)錯(cuò)誤的函數(shù)之前使用該代碼,并catch讓您優(yōu)雅地處理錯(cuò)誤碧信。

如果在do塊內(nèi)引發(fā)任何錯(cuò)誤赊琳,執(zhí)行將立即跳轉(zhuǎn)到該catch

do {
    try checkPassword("password")
    print("That password is good!")
} catch {
    print("You can't use that password.")
}

當(dāng)該代碼運(yùn)行時(shí),將顯示“You can't use that password.”砰碴,但不會(huì)顯示“That password is good!”-永遠(yuǎn)不會(huì)到達(dá)該代碼躏筏,因?yàn)闀?huì)引發(fā)錯(cuò)誤。

8呈枉、輸入?yún)?shù)

傳遞給Swift函數(shù)的所有參數(shù)都是常量趁尼,因此您無法更改它們。如果需要猖辫,可以將一個(gè)或多個(gè)參數(shù)作為傳入inout酥泞,這意味著可以在函數(shù)內(nèi)部進(jìn)行更改,這些更改將反映在函數(shù)外部的原始值中啃憎。

例如芝囤,如果您想將一個(gè)數(shù)字加倍(即直接更改該值而不是返回一個(gè)新的數(shù)字),則可以編寫如下函數(shù)

func doubleInPlace(number: inout Int) {
    number *= 2
}

要使用它辛萍,首先需要使一個(gè)變量整數(shù)–您不能將常量整數(shù)與一起使用inout悯姊,因?yàn)樗鼈兛赡軙?huì)被更改。您還需要在參數(shù)名稱之前將參數(shù)傳遞給doubleInPlace使用&符贩毕,&這是對(duì)您知道它已被用作的明確認(rèn)可inout悯许。

var myNum = 10 
doubleInPlace(number: &myNum)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市耳幢,隨后出現(xiàn)的幾起案子岸晦,更是在濱河造成了極大的恐慌欧啤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件启上,死亡現(xiàn)場離奇詭異邢隧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冈在,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門倒慧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人包券,你說我怎么就攤上這事纫谅。” “怎么了溅固?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵付秕,是天一觀的道長。 經(jīng)常有香客問我侍郭,道長询吴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任亮元,我火速辦了婚禮猛计,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爆捞。我一直安慰自己奉瘤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布煮甥。 她就那樣靜靜地躺著盗温,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苛秕。 梳的紋絲不亂的頭發(fā)上肌访,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天找默,我揣著相機(jī)與錄音艇劫,去河邊找鬼。 笑死惩激,一個(gè)胖子當(dāng)著我的面吹牛店煞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播风钻,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼顷蟀,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了骡技?” 一聲冷哼從身側(cè)響起鸣个,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤羞反,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后囤萤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昼窗,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年涛舍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澄惊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡富雅,死狀恐怖掸驱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情没佑,我是刑警寧澤毕贼,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站蛤奢,受9級(jí)特大地震影響帅刀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜远剩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一扣溺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓜晤,春花似錦锥余、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至足画,卻和暖如春雄驹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淹辞。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工医舆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人象缀。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓蔬将,卻偏偏與公主長得像,于是被迫代替她去往敵國和親央星。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霞怀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345