上篇文章談到了可選猛拴,可選可以讓你判斷值是否存在,你可以在代碼中優(yōu)雅地處理值缺失的情況蚀狰。然而愉昆,在某些情況下,如果值缺失或者值并不滿足特定的條件麻蹋,你的代碼可能并不需要繼續(xù)執(zhí)行跛溉。這 時(shí),你可以在你的代碼中觸發(fā)一個(gè)斷言(assertion)來(lái)結(jié)束代碼運(yùn)行并通過(guò)調(diào)試來(lái)找到值 缺失的原因扮授。
一:使用斷言進(jìn)行調(diào)試
斷言會(huì)在運(yùn)行時(shí)判斷一個(gè)邏輯條件是否為 true芳室。從字面意思來(lái)說(shuō),斷言“斷言”一個(gè)條件是否為真刹勃。你可以使用斷言來(lái)保證在運(yùn)行其他代碼之前堪侯,某些重要的條件已經(jīng)被滿足。如果 條件判斷為 true深夯,代碼運(yùn)行會(huì)繼續(xù)進(jìn)行;如果條件判斷為 false抖格,代碼運(yùn)行停止,你的應(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 函數(shù)來(lái)寫一個(gè)斷言质蕉。向 assert 函數(shù)傳入一個(gè)結(jié)果為 true 或者 false 的表達(dá)式以及一條信息,當(dāng)表達(dá)式為 false 的時(shí)候這條信息會(huì)被顯示:
let age = -3
assert(age >= 0, "A person is age cannot be less than zero")
// 因?yàn)?age < 0, 所以斷言會(huì)觸發(fā)
在這個(gè)例子中翩肌,只有 age >= 0 為 true 的時(shí)候代碼運(yùn)行才會(huì)繼續(xù)模暗,也就是說(shuō),當(dāng) age 的值 非負(fù)的時(shí)候念祭。如果 age 的值是負(fù)數(shù)兑宇,就像代碼中那樣,age >= 0 為 false粱坤,斷言被觸發(fā)隶糕, 結(jié)束應(yīng)用瓷产。
斷言信息不能使用字符串插值。斷言信息可以省略枚驻,就像這樣:
assert( age > = 0)
二:何時(shí)使用斷言
當(dāng)條件可能為假時(shí)使用斷言濒旦,但是最終一定要保證條件為真,這樣你的代碼才能繼續(xù)運(yùn)行再登。斷言的適用情景:
整數(shù)的附屬腳本索引被傳入一個(gè)自定義附屬腳本實(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ì)你的代碼來(lái)讓非法條件不會(huì)出現(xiàn)。然而缠俺,在你的應(yīng)用發(fā)布之前显晶,有時(shí)候非法條件可能出現(xiàn),這時(shí)使用斷言可以快速發(fā)現(xiàn)問(wèn)題壹士。