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)