1.常量和變量
常量和變量把一個名字和一個指定類型的值關聯(lián)起來石蔗。常量的值一旦設定就不能改變,而變量的值可以隨意更改辆童。
1.1聲明常量和變量
常量和變量必須在使用前聲明隧期,用 let 來聲明常量飒责,用 var 來聲明變量。
let maximumNumberOfLoginAttempts = 10//允許的最大嘗試登錄次數(shù)
var currentLoginAttempt = 0//當前嘗試登錄次數(shù)
這兩行代碼可以被理解為:
聲明一個名字是 maximumNumberOfLoginAttempts 的新常量仆潮,并給它一個值 10 宏蛉。然后,聲明一個名字是 currentLoginAttempt 的變量并將它的值初始化為 0 性置。在這個例子中拾并,允許的最大嘗試登錄次數(shù)被聲明為一個常量,因為這個值不會改變鹏浅。當前嘗試登錄次數(shù)被聲明為一個變量嗅义,因為每次嘗試登錄失敗的時候都需要增加這個值。
你可以在一行中聲明多個常量或者多個變量隐砸,用逗號隔開:
var x = 1.0, y = 2.0, z = 3.0
var x = 12, y = 22, z = 32
1.2類型的標注
當你聲明常量或者變量的時候可以加上類型標注(type annotation)之碗,說明常量或者變量中要存儲的值的類
型。如果要添加類型標注季希,需要在常量或者變量名后面加上一個冒號和空格褪那,然后加上類型名稱。
這個例子給 welcomeMessage 變量添加了類型標注式塌,表示這個變量可以存儲 String 類型的值:
var welcomeMessage: String
聲明中的冒號代表著“是…類型”博敬,所以這行代碼可以被理解為:
“聲明一個類型為 String ,名字為 welcomeMessage 的變量峰尝∑眩”
“類型為 String ”的意思是“可以存儲任意 String 類型的值∥溲В”
welcomeMessage 變量現(xiàn)在可以被設置成任意字符串:
welcomeMessage = "Hello"
你可以在一行中定義多個同樣類型的變量祭往,用逗號分割,并在最后一個變量名之后添加類型標注:
var red, green, blue: Double
注意:
一般來說你很少需要寫類型標注劳淆。如果你在聲明常量或者變量的時候賦了一個初始值链沼,Swift可以推斷出這個常
量或者變量的類型。在上面的例子中沛鸵,沒有給 welcomeMessage 賦初始
值括勺,所以變量 welcomeMessage 的類型是通過一個類型標注指定的,而不是通過初始值推斷的曲掰。
1.3常量和變量的命名
你可以用任何你喜歡的字符作為常量和變量名疾捍,包括 Unicode 字符:
let π = 3.14159
let 你好 = "你好世界"
let ?? = "dogcow"
常量與變量名不能包含數(shù)學符號,箭頭栏妖,保留的(或者非法的)Unicode 碼位乱豆,連線與制表符。也不能以數(shù)字開
頭吊趾,但是可以在常量與變量名的其他地方包含數(shù)字宛裕。
一旦你將常量或者變量聲明為確定的類型瑟啃,你就不能使用相同的名字再次進行聲明,或者改變其存儲的值的類
型揩尸。同時蛹屿,你也不能將常量與變量進行互轉(zhuǎn)。
注意:
如果你需要使用與Swift保留關鍵字相同的名稱作為常量或者變量名岩榆,你可以使用反引號(`)將關鍵字包圍的方
式將其作為名字使用错负。無論如何,你應當避免使用關鍵字作為常量或變量名勇边。
你可以更改現(xiàn)有的變量值為其他同類型的值犹撒,在下面的例子中, friendlyWelcome 的值從 “Hello!” 改為了 “Bonj our!” :
var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
// friendlyWelcome 現(xiàn)在是 “Bonjour!”
與變量不同粒褒,常量的值一旦被確定就不能更改了识颊。嘗試這樣做會導致編譯時報錯:
let languageName = "Swift"
languageName = "Swift++"
// 這會報編譯時錯誤 - languageName 不可改變
1.4輸出常量和變量
你可以用 print(_:separator:terminator:) 函數(shù)來輸出當前常量或變量的值:
print(friendlyWelcome)
// 輸出 “Bonjour!”
print(_:separator:terminator:) 是一個用來輸出一個或多個值到適當輸出區(qū)的全局函數(shù)
注意:Swift 用字符串插值(string interpolation)的方式把常量名或者變量名當做占位符加入到長字符串中,Swift 會
用當前常量或變量的值替換這些占位符怀浆。將常量或變量名放入圓括號中谊囚,并在開括號前使用反斜杠將其轉(zhuǎn)義:
print("The current value of friendlyWelcome is \(friendlyWelcome)")
// 輸出 "The current value of friendlyWelcome is Bonjour!
2.注釋
2.1 單行注釋
Swift 中的注釋與C 語言的注釋非常相似。單行注釋以雙正斜杠( // )作為起始標記:
// 這是一個注釋
2.2 行多行注釋执赡,
其起始標記為單個正斜杠后跟隨一個星號( /* )镰踏,終止標記為一個星號后跟隨單個正斜杠( */ ):
/* 這是一個,
多行注釋 */
2.3 Swift 的多行注釋可以嵌套在其它的多行注釋之中
/* 這是第一個多行注釋的開頭
/* 這是第二個被嵌套的多行注釋 */
這是第一個多行注釋的結(jié)尾 */
3. 分號
Swift 并不強制要求你在每條語句的結(jié)尾處使用分號( ; ),當然沙合,你也可以按照你自己的習慣添加分號奠伪。有一種情況下必須要用分號,即你打算在同一行內(nèi)寫多條獨立的語句:
let cat = "?"; print(cat)首懈;var title :String绊率;
// 輸出 "?"
4. 整數(shù)
整數(shù)就是沒有小數(shù)部分的數(shù)字,比如 42 和 -23 究履。整數(shù)可以是 有符號 (正滤否、負、零)或者 無符號 (正最仑、零)藐俺。
Swift 提供了8,16泥彤,32和64位的有符號和無符號整數(shù)類型欲芹。這些整數(shù)類型和 C 語言的命名方式很像,比如8位
無符號整數(shù)類型是 UInt8 吟吝,32位有符號整數(shù)類型是 Int32 菱父。就像 Swift 的其他類型一樣,整數(shù)類型采用大寫命名
法。
4.1整數(shù)范圍
你可以訪問不同整數(shù)類型的 min 和 max 屬性來獲取對應類型的最小值和最大值:
let minValue = UInt8.min // minValue 為 0浙宜,是 UInt8 類型
let maxValue = UInt8.max // maxValue 為 255官辽,是 UInt8 類型
min 和 max 所傳回值的類型,正是其所對的整數(shù)類型(如上例UInt8, 所傳回的類型是UInt8)粟瞬,可用在表達式中相同類型值旁野崇。
4.2 Int
一般來說,你不需要專門指定整數(shù)的長度亩钟。Swift 提供了一個特殊的整數(shù)類型 Int ,長度與當前平臺的原生字長相
同:
? 在32位平臺上鳖轰, Int 和 Int32 長度相同清酥。
? 在64位平臺上, Int 和 Int64 長度相同蕴侣。
除非你需要特定長度的整數(shù)焰轻,一般來說使用 Int 就夠了。這可以提高代碼一致性和可復用性昆雀。即使是在32位平臺
上辱志, Int 可以存儲的整數(shù)范圍也可以達到 -2,147,483,648 ~ 2,147,483,647 ,大多數(shù)時候這已經(jīng)足夠大了狞膘。
4.3UInt
Swift 也提供了一個特殊的無符號類型 UInt 揩懒,長度與當前平臺的原生字長相同:
? 在32位平臺上, UInt 和 UInt32 長度相同挽封。
? 在64位平臺上已球, UInt 和 UInt64 長度相同。
注意:
盡量不要使用 UInt 辅愿,除非你真的需要存儲一個和當前平臺原生字長相同的無符號整數(shù)智亮。除了這種情況,最好使用 Int 点待,即使你要存儲的值已知是非負的阔蛉。統(tǒng)一使用 Int 可以提高代碼的可復用性,避免不同類型數(shù)字之間的轉(zhuǎn)換癞埠,并且匹配數(shù)字的類型推斷状原。
5.浮點數(shù)
浮點數(shù)是有小數(shù)部分的數(shù)字啰劲,比如 3.14159 外盯, 0.1 和 -273.15 。
浮點類型比整數(shù)類型表示的范圍更大壶硅,可以存儲比 Int 類型更大或者更小的數(shù)字徒探。Swift 提供了兩種有符號浮點數(shù)
類型:
? Double 表示64位浮點數(shù)瓦呼。當你需要存儲很大或者很高精度的浮點數(shù)時請使用此類型。
? Float 表示32位浮點數(shù)。精度要求不高的話可以使用此類型央串。
注意:
Double 精確度很高磨澡,至少有15位數(shù)字,而 Float 最少只有6位數(shù)字质和。選擇哪個類型取決于你的代碼需要處理的
值的范圍稳摄。
6.類型安全和類型推斷
Swift 是一個類型安全(type safe)的語言。類型安全的語言可以讓你清楚地知道代碼要處理的值的類型饲宿。如果你的代碼需要一個 String 厦酬,你絕對不可能不小心傳進去一個 Int 。由于 Swift 是類型安全的瘫想,所以它會在編譯你的代碼時進行類型檢查(type checks)仗阅,并把不匹配的類型標記
為錯誤。這可以讓你在開發(fā)的時候盡早發(fā)現(xiàn)并修復錯誤国夜。
當你要處理不同類型的值時减噪,類型檢查可以幫你避免錯誤。然而车吹,這并不是說你每次聲明常量和變量的時候都需要顯式指定類型筹裕。如果你沒有顯式指定類型,Swift 會使用 類型推斷 (type inference)來選擇合適的類型窄驹。有了類型推斷朝卒,編譯器可以在編譯代碼的時候自動推斷出表達式的類型。原理很簡單馒吴,只要檢查你賦的值即可扎运。
因為有類型推斷,和 C 或者 Objective-C 比起來 Swift 很少需要聲明類型饮戳。常量和變量雖然需要明確類型豪治,但是大部分工作并不需要你自己來完成。當你聲明常量或者變量并賦初值的時候類型推斷非常有用扯罐。當你在聲明常量或者變量的時候賦給它們一個字面量(literal value 或 literal)即可觸發(fā)類型推斷负拟。(字面量就是會直接出現(xiàn)在你代碼中的值,比如 42 和 3.14159 歹河。)
例如掩浙,如果你給一個新常量賦值 42 并且沒有標明類型,Swift 可以推斷出常量類型是 Int 秸歧,因為你給它賦的初始
值看起來像一個整數(shù):
let meaningOfLife = 42
// meaningOfLife 會被推測為 Int 類型
同理厨姚,如果你沒有給浮點字面量標明類型,Swift 會推斷你想要的是 Double :
let pi = 3.14159
// pi 會被推測為 Double 類型
當推斷浮點數(shù)的類型時键菱,Swift 總是會選擇 Double 而不是 Float 谬墙。
如果表達式中同時出現(xiàn)了整數(shù)和浮點數(shù),會被推斷為 Double 類型:
let anotherPi = 3 + 0.14159
// anotherPi 會被推測為 Double 類型
原始值 3 沒有顯式聲明類型,而表達式中出現(xiàn)了一個浮點字面量拭抬,所以表達式會被推斷為 Double 類型部默。
7.數(shù)值型字面量
整數(shù)字面量可以被寫作:
? 一個十進制數(shù),沒有前綴
? 一個二進制數(shù)造虎,前綴是 0b
? 一個八進制數(shù)傅蹂,前綴是 0o
? 一個十六進制數(shù),前綴是 0x
下面的所有整數(shù)字面量的十進制值都是 17 :
let decimalInteger = 17
let binaryInteger = 0b10001 // 二進制的17
let octalInteger = 0o21 // 八進制的17
let hexadecimalInteger = 0x11 // 十六進制的17
浮點字面量可以是十進制(沒有前綴)或者是十六進制(前綴是 0x )算凿。小數(shù)點兩邊必須有至少一個十進制數(shù)
字(或者是十六進制的數(shù)字)份蝴。浮點字面量還有一個可選的指數(shù)(exponent,在十進制浮點數(shù)中通過大寫或者小
寫的 e 來指定氓轰,在十六進制浮點數(shù)中通過大寫或者小寫的 p 來指定搞乏。
如果一個十進制數(shù)的指數(shù)為 exp ,那這個數(shù)相當于基數(shù)和10^exp的乘積: * 1.25e2 表示 1.25 × 10^2戒努,等于
125.0 。 * 1.25e-2 表示 1.25 × 10^-2镐躲,等于 0.0125 储玫。
如果一個十六進制數(shù)的指數(shù)為 exp ,那這個數(shù)相當于基數(shù)和2^exp的乘積: * 0xFp2 表示 15 × 2^2萤皂,等于 6
0.0 撒穷。 * 0xFp-2 表示 15 × 2^-2,等于 3.75 裆熙。
下面的這些浮點字面量都等于十進制的 12.1875 :
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
數(shù)值類字面量可以包括額外的格式來增強可讀性端礼。整數(shù)和浮點數(shù)都可以添加額外的零并且包含下劃線,并不會影
響字面量:
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
8.數(shù)值型類型轉(zhuǎn)換
通常來講入录,即使代碼中的整數(shù)常量和變量已知非負蛤奥,也請使用 Int 類型×鸥澹總是使用默認的整數(shù)類型可以保證你的
整數(shù)常量和變量可以直接被復用并且可以匹配整數(shù)類字面量的類型推斷凡桥。
只有在必要的時候才使用其他整數(shù)類型,比如要處理外部的長度明確的數(shù)據(jù)或者為了優(yōu)化性能蚀同、內(nèi)存占用等
等缅刽。使用顯式指定長度的類型可以及時發(fā)現(xiàn)值溢出并且可以暗示正在處理特殊數(shù)據(jù)。
8.2整數(shù)轉(zhuǎn)換
不同整數(shù)類型的變量和常量可以存儲不同范圍的數(shù)字蠢络。 Int8 類型的常量或者變量可以存儲的數(shù)字范圍是 -12
8 ~ 127 衰猛,而 UInt8 類型的常量或者變量能存儲的數(shù)字范圍是 0 ~ 255 。如果數(shù)字超出了常量或者變量可存儲的
范圍刹孔,編譯的時候會報錯:
let cannotBeNegative: UInt8 = -1
// UInt8 類型不能存儲負數(shù)啡省,所以會報錯
let tooBig: Int8 = Int8.max + 1
// Int8 類型不能存儲超過最大值的數(shù),所以會報錯
由于每種整數(shù)類型都可以存儲不同范圍的值,所以你必須根據(jù)不同情況選擇性使用數(shù)值型類型轉(zhuǎn)換冕杠。這種選擇性
使用的方式微姊,可以預防隱式轉(zhuǎn)換的錯誤并讓你的代碼中的類型轉(zhuǎn)換意圖變得清晰。
要將一種數(shù)字類型轉(zhuǎn)換成另一種分预,你要用當前值來初始化一個期望類型的新數(shù)字兢交,這個數(shù)字的類型就是你的目標
類型。在下面的例子中笼痹,常量 twoThousand 是 UInt16 類型配喳,然而常量 one 是 UInt8 類型。它們不能直接相
加凳干,因為它們類型不同晴裹。所以要調(diào)用 UInt16(one) 來創(chuàng)建一個新的 UInt16 數(shù)字并用 one 的值來初始化,然后使
用這個新數(shù)字來計算:
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
現(xiàn)在兩個數(shù)字的類型都是 UInt16 救赐,可以進行相加涧团。目標常量 twoThousandAndOne 的類型被推斷為 UInt16 ,因為它是兩個 UInt16 值的和经磅。
SomeType(ofInitialValue) 是調(diào)用 Swift 構(gòu)造器并傳入一個初始值的默認方法泌绣。在語言內(nèi)部, UInt16 有一個構(gòu)
造器预厌,可以接受一個 UInt8 類型的值阿迈,所以這個構(gòu)造器可以用現(xiàn)有的 UInt8 來創(chuàng)建一個新的 UInt16 。注意轧叽,你
并不能傳入任意類型的值苗沧,只能傳入 UInt16 內(nèi)部有對應構(gòu)造器的值。不過你可以擴展現(xiàn)有的類型來讓它可以接收
其他類型的值(包括自定義類型).
8.3整數(shù)和浮點數(shù)轉(zhuǎn)換
整數(shù)和浮點數(shù)的轉(zhuǎn)換必須顯式指定類型:
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi 等于 3.14159炭晒,所以被推測為 Double 類型
這個例子中待逞,常量 three 的值被用來創(chuàng)建一個 Double 類型的值,所以加號兩邊的數(shù)類型須相同网严。如果不進行轉(zhuǎn)
換飒焦,兩者無法相加。
浮點數(shù)到整數(shù)的反向轉(zhuǎn)換同樣行屿笼,整數(shù)類型可以用 Double 或者 Float 類型來初始化:
let integerPi = Int(pi)
// integerPi 等于 3牺荠,所以被推測為 Int 類型
當用這種方式來初始化一個新的整數(shù)值時,浮點值會被截斷驴一。也就是說 4.75 會變成 4 休雌, -3.9 會變成 -3 。
注意:
結(jié)合數(shù)字類常量和變量不同于結(jié)合數(shù)字類字面量肝断。字面量 3 可以直接和字面量 0.14159 相加杈曲,因為數(shù)字字面量
本身沒有明確的類型驰凛。它們的類型只在編譯器需要求值的時候被推測。
9.類型別名
類型別名(type aliases)就是給現(xiàn)有類型定義另一個名字担扑。你可以使用 typealias 關鍵字來定義類型別名恰响。
當你想要給現(xiàn)有類型起一個更有意義的名字時,類型別名非常有用涌献。假設你正在處理特定長度的外部資源的數(shù)據(jù):
typealias AudioSample = UInt16
定義了一個類型別名之后胚宦,你可以在任何使用原始名的地方使用別名:
var maxAmplitudeFound = AudioSample.min
// maxAmplitudeFound 現(xiàn)在是 0
本例中, AudioSample 被定義為 UInt16 的一個別名燕垃。因為它是別名枢劝, AudioSample.min 實際上是 UInt16.mi
n ,所以會給 maxAmplitudeFound 賦一個初值 0 卜壕。
10 布爾值(Bool)
Swift 有一個基本的布爾(Boolean)類型您旁,叫做 Bool 。布爾值指邏輯上的值轴捎,因為它們只能是真或者假鹤盒。Swift 有兩個布爾常量, true 和 false :
let orangesAreOrange = true
let turnipsAreDelicious = false
orangesAreOrange 和 turnipsAreDelicious 的類型會被推斷為 Bool 侦副,因為它們的初值是布爾字面量昨悼。就像之前提到的 Int 和 Double 一樣,如果你創(chuàng)建變量的時候給它們賦值 true 或者 false 跃洛,那你不需要將常量或者變量聲明為 Bool 類型。初始化常量或者變量的時候如果所賦的值類型已知终议,就可以觸發(fā)類型推斷汇竭,這讓 Swift 代碼更加簡潔并且可讀性更高。當你編寫條件語句比如 if 語句的時候穴张,布爾值非常有用:
if turnipsAreDelicious {
print("Mmm, tasty turnips!")
} else {
print("Eww, turnips are horrible.")
}
// 輸出 "Eww, turnips are horrible."
條件語句细燎,例如 if 如果你在需要使用 Bool 類型的地方使用了非布爾值,Swift 的類型安全機制會報錯皂甘。下面的例子會報告一個編譯
時錯誤:
let i = 1
if i {
// 這個例子不會通過編譯玻驻,會報錯
}
然而,下面的例子是合法的:
let i = 1
if i == 1 {
// 這個例子會編譯成功
}
i == 1 的比較結(jié)果是 Bool 類型偿枕,所以第二個例子可以通過類型檢查璧瞬。類似 i == 1 這樣的比較.和 Swift 中的其他類型安全的例子一樣,這個方法可以避免錯誤并保證這塊代碼的意圖總是清晰的渐夸。
11.元組
元組(tuples)把多個值組合成一個復合值嗤锉。元組內(nèi)的值可以是任意類型,并不要求是相同類型墓塌。
下面這個例子中瘟忱, (404, “Not Found”) 是一個描述 HTTP 狀態(tài)碼(HTTP status code)的元組奥额。HTTP 狀態(tài)
碼是當你請求網(wǎng)頁的時候 web 服務器返回的一個特殊值。如果你請求的網(wǎng)頁不存在就會返回一個 404 Not Foun
d 狀態(tài)碼访诱。
let http404Error = (404, "Not Found")
// http404Error 的類型是 (Int, String)垫挨,值是 (404, "Not Found")
(404, “Not Found”) 元組把一個 Int 值和一個 String 值組合起來表示 HTTP 狀態(tài)碼的兩個部分:一個數(shù)字和一
個人類可讀的描述。這個元組可以被描述為“一個類型為 (Int, String) 的元組”触菜。
你可以把任意順序的類型組合成一個元組九榔,這個元組可以包含所有類型。只要你想玫氢,你可以創(chuàng)建一個類型為 (Int, I
nt, Int) 或者 (String, Bool) 或者其他任何你想要的組合的元組帚屉。
你可以將一個元組的內(nèi)容分解(decompose)成單獨的常量和變量,然后你就可以正常使用它們了:
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// 輸出 "The status code is 404"
print("The status message is \(statusMessage)")
// 輸出 "The status message is Not Found"
如果你只需要一部分元組值漾峡,分解的時候可以把要忽略的部分用下劃線( _ )標記:
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 輸出 "The status code is 404"
此外攻旦,你還可以通過下標來訪問元組中的單個元素,下標從零開始:
print("The status code is \(http404Error.0)")
// 輸出 "The status code is 404"
print("The status message is \(http404Error.1)")
// 輸出 "The status message is Not Found"
你可以在定義元組的時候給單個元素命名:
let http200Status = (statusCode: 200, description: “OK”)
給元組中的元素命名后生逸,你可以通過名字來獲取這些元素的值:
print("The status code is \(http200Status.statusCode)")
// 輸出 "The status code is 200"
print("The status message is \(http200Status.description)")
// 輸出 "The status message is OK"
作為函數(shù)返回值時牢屋,元組非常有用。一個用來獲取網(wǎng)頁的函數(shù)可能會返回一個 (Int, String) 元組來描述是否獲取
成功槽袄。和只能返回一個類型的值比較起來烙无,一個包含兩個不同類型值的元組可以讓函數(shù)的返回信息更有用。請參
考函數(shù)參數(shù)與返回值 (頁 0)遍尺。
注意:
元組在臨時組織值的時候很有用截酷,但是并不適合創(chuàng)建復雜的數(shù)據(jù)結(jié)構(gòu)。如果你的數(shù)據(jù)結(jié)構(gòu)并不是臨時使用乾戏,請使
用類或者結(jié)構(gòu)體而不是元組迂苛。請參考類和結(jié)構(gòu)體。
10.可選類型
10.1nil
你可以給可選變量賦值為 nil 來表示它沒有值:
var serverResponseCode: Int? = 404
// serverResponseCode 包含一個可選的 Int 值 404
serverResponseCode = nil
// serverResponseCode 現(xiàn)在不包含值
注意:
nil 不能用于非可選的常量和變量鼓择。如果你的代碼中有常量或者變量需要處理值缺失的情況三幻,請把它們聲明成對
應的可選類型。
如果你聲明一個可選常量或者變量但是沒有賦值呐能,它們會自動被設置為 nil :
var surveyAnswer: String?
// surveyAnswer 被自動設置為 nil
11.錯誤處理
你可以使用錯誤處理(error handling)來應對程序執(zhí)行中可能會遇到的錯誤條件念搬。
相對于可選中運用值的存在與缺失來表達函數(shù)的成功與失敗,錯誤處理可以推斷失敗的原因摆出,并傳播至程序的其
他部分朗徊。
當一個函數(shù)遇到錯誤條件,它能報錯偎漫。調(diào)用函數(shù)的地方能拋出錯誤消息并合理處理荣倾。
func canThrowAnErrow() throws {
// 這個函數(shù)有可能拋出錯誤
}
一個函數(shù)可以通過在聲明中添加 throws 關鍵詞來拋出錯誤消息。當你的函數(shù)能拋出錯誤消息時, 你應該在表達式
中前置 try 關鍵詞骑丸。
do {
try canThrowAnErrow()
// 沒有錯誤消息拋出
} catch {
// 有一個錯誤消息拋出
}
一個 do 語句創(chuàng)建了一個新的包含作用域,使得錯誤能被傳播到一個或多個 catch 從句舌仍。
這里有一個錯誤處理如何用來應對不同錯誤條件的例子妒貌。
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich()
} catch Error.OutOfCleanDishes {
washDishes()
} catch Error.MissingIngredients(let ingredients) {
buyGroceries(ingredients)
}
在此例中, makeASandwich() (做一個三明治)函數(shù)會拋出一個錯誤消息如果沒有干凈的盤子或者某個原料缺
失铸豁。因為 makeASandwich() 拋出錯誤灌曙,函數(shù)調(diào)用被包裹在 try 表達式中。將函數(shù)包裹在一個 do 語句中,任何被
拋出的錯誤會被傳播到提供的 catch 從句中节芥。
如果沒有錯誤被拋出, eatASandwich() 函數(shù)會被調(diào)用在刺。如果一個匹配 Error.OutOfCleanDishes 的錯誤被拋出, washDishes 函數(shù)會被調(diào)用。如果一個匹配 Error.MissingIngredients 的錯誤被拋出头镊,buyGroceries(_:) 函數(shù)會隨著被 catch 所捕捉到的關聯(lián)值 [String] 被調(diào)用蚣驼。拋出,捕捉相艇,以及傳播錯誤會在錯誤處理颖杏。