可選類型可以讓你判斷值是否存在,你可以在代碼中優(yōu)雅地處理值缺失的情況。然而,在某些情況下,如果值缺失或者值并不滿足特定的條件,你的代碼可能沒辦法繼續(xù)執(zhí)行。這時(shí),你可以在你的代碼中觸發(fā)一個(gè)* 斷言(assertion) *來結(jié)束代碼運(yùn)行并通過調(diào)試來找到值缺失的原因。
使用斷言進(jìn)行調(diào)試####
斷言會(huì)在運(yùn)行時(shí)判斷一個(gè)邏輯條件是否為* true *。從字面意思來說,斷言“斷言”一個(gè)條件是否為真。你可以使用斷言來保證在運(yùn)行其他代碼之前,某些重要的條件已經(jīng)被滿足。如果條件判斷為 true ,代碼運(yùn)行會(huì)繼續(xù)進(jìn)行;如果條件判斷為 false ,代碼執(zhí)行結(jié)束,你的應(yīng)用被終止。
如果你的代碼在調(diào)試環(huán)境下觸發(fā)了一個(gè)斷言,比如你在 Xcode 中構(gòu)建并運(yùn)行一個(gè)應(yīng)用,你可以清楚地看到不合法 的狀態(tài)發(fā)生在哪里并檢查斷言被觸發(fā)時(shí)你的應(yīng)用的狀態(tài)。此外,斷言允許你附加一條調(diào)試信息。
你可以使用全局 assert(::file:line:) 函數(shù)來寫一個(gè)斷言。向這個(gè)函數(shù)傳入一個(gè)結(jié)果為 true 或者 false 的表達(dá)式以及一條信息,當(dāng)表達(dá)式的結(jié)果為 false 的時(shí)候這條信息會(huì)被顯示:
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// 因?yàn)?age < 0,所以斷言會(huì)觸發(fā)
在這個(gè)例子中,只有 age >= 0 為 true 的時(shí)候,即 age 的值非負(fù)的時(shí)候,代碼才會(huì)繼續(xù)執(zhí)行。如果 age 的值是負(fù)數(shù),就像代碼中那樣, age >= 0 為 false ,斷言被觸發(fā),終止應(yīng)用。
如果不需要斷言信息,可以省略,就像這樣:
assert(age >= 0)
注意:
當(dāng)代碼使用優(yōu)化編譯的時(shí)候,斷言將會(huì)被禁用,例如在 Xcode 中,使用默認(rèn)的 target Release 配置選項(xiàng)來 build 時(shí),斷言會(huì)被禁用。
何時(shí)使用斷言####
當(dāng)條件可能為假時(shí)使用斷言,但是最終一定要保證條件為真,這樣你的代碼才能繼續(xù)運(yùn)行。斷言的適用情景:
- 整數(shù)類型的下標(biāo)索引被傳入一個(gè)自定義下標(biāo)實(shí)現(xiàn),但是下標(biāo)索引值可能太小或者太大。
- 需要給函數(shù)傳入一個(gè)值,但是非法的值可能導(dǎo)致函數(shù)不能正常執(zhí)行。
- 一個(gè)可選值現(xiàn)在是* nil* ,但是后面的代碼運(yùn)行需要一個(gè)非 nil 值。
注意:
斷言可能導(dǎo)致你的應(yīng)用終止運(yùn)行,所以你應(yīng)當(dāng)仔細(xì)設(shè)計(jì)你的代碼來讓非法條件不會(huì)出現(xiàn)。然而,在你的應(yīng)用發(fā)布之前,有時(shí)候非法條件可能出現(xiàn),這時(shí)使用斷言可以快速發(fā)現(xiàn)問題。