斷言和先決條件(Assertions and Preconditions)

? ? 斷言和先決條件發(fā)是運(yùn)行時(shí)發(fā)生的檢測滚局。使用它們可以確保在執(zhí)行后面的代碼之前已經(jīng)滿足了條件叁温。如果斷言或者先決條件中的值是true,代碼像原來一樣繼續(xù)執(zhí)行核畴。如果條件是false膝但,程序當(dāng)前的狀態(tài)就是無效的,代碼會(huì)結(jié)束執(zhí)行谤草,app也會(huì)停止運(yùn)行跟束。

? ? 使用斷言和先決條件來表現(xiàn)出你編寫代碼的時(shí)候做的假設(shè)和希望,并讓他們成為你代碼的一部分丑孩。斷言幫助你在開發(fā)過程中發(fā)現(xiàn)錯(cuò)誤和不合適的假設(shè)冀宴。先決條件幫助你在生產(chǎn)環(huán)境下檢測問題。

? ? 除了在運(yùn)行時(shí)驗(yàn)證你的期望温学,斷言和先決條件也可以成為代碼中的文檔略贮,這很有用。和上一章討論的錯(cuò)誤處理不一樣,斷言和先決條件不是用來處理可恢復(fù)的或者預(yù)期會(huì)發(fā)生的錯(cuò)誤的逃延。因?yàn)楫?dāng)一個(gè)斷言或者先決條件失敗了览妖,那么程序當(dāng)前的狀態(tài)就是無效的,沒有辦法捕獲一個(gè)發(fā)生了錯(cuò)誤的斷言揽祥。

? ? 使用斷言或者先決條件讽膏,不是為了把代碼設(shè)計(jì)成不會(huì)出現(xiàn)不符合條件的樣子。使用它們加強(qiáng)數(shù)據(jù)和狀態(tài)的有效性使你可以預(yù)見到app在出現(xiàn)不可用狀態(tài)的時(shí)候會(huì)導(dǎo)致結(jié)束拄丰,也使問題更加容易被調(diào)試府树。只要偵測到異常就結(jié)束執(zhí)行也可以最小化無效的狀態(tài)帶來的危害。

? ? 斷言和先決條件的不同之處在于它們檢測的時(shí)機(jī)不一樣:斷言只在調(diào)試模式中檢測料按,先決條件在調(diào)試模式和產(chǎn)品模式都會(huì)檢測奄侠。在產(chǎn)品模式下,斷言中的條件不會(huì)被檢測载矿,也就是說在開發(fā)過程中遭铺,無論使用多少斷言,都不會(huì)影響最后的產(chǎn)品的性能恢准。


使用斷言調(diào)試(Debugging with Assertions)

? ? 我們通過調(diào)用Swift標(biāo)準(zhǔn)庫的assert(_:_:file:line:)方法來書寫斷言魂挂。傳入一個(gè)結(jié)果是true或者false的表達(dá)式和一個(gè)當(dāng)條件是false的時(shí)候要展示的信息,比如:

? ??????let age = -3

????????assert(age >= 0, "A person's age can't be less than zero.")

????????// 這個(gè)斷言會(huì)失敗馁筐, 應(yīng)該 -3 ?>= 0 結(jié)果是false.

? ? 這個(gè)例子中涂召,如果 age>=0是true,也就是age如果是一個(gè)非負(fù)數(shù),代碼會(huì)繼續(xù)執(zhí)行敏沉。如果age的值是一個(gè)負(fù)數(shù)果正,在上面的代碼中,age>=0就是false盟迟,然后斷言會(huì)失敗秋泳,應(yīng)用會(huì)結(jié)束。

? ? 你也可以省略斷言的信息攒菠,比如迫皱,只是需要重復(fù)檢查條件:

? ??????assert(age >= 0)

? ? 如果代碼中已經(jīng)檢查了條件,你可以使用assertionFailure(_:file:line:)函數(shù)表明這個(gè)斷言失敗了辖众,比如:

? ??????if age > 10 {

? ? ????????????print("You can ride the roller-coaster or the ferris wheel.")

????????????} else if age > 0 {

????????????? ? print("You can ride the ferris wheel.")

????????????} else {

????????????? ? assertionFailure("A person's age can't be less than zero.")

????????}

強(qiáng)制執(zhí)行先決條件(Enforcing Preconditions)

? ? 當(dāng)條件有可能是false的情況下卓起,使用先決條件,但是需要確定只有當(dāng)條件是true的時(shí)候你的代碼才會(huì)繼續(xù)執(zhí)行凹炸。例如戏阅,使用先決條件判斷一個(gè)下標(biāo)是不是越界了,或者檢查入?yún)⑹遣皇怯行А?/p>

? ? 可以通過調(diào)用precondition(_:_:file:line:)函數(shù)書寫先決條件啤它。傳入一個(gè)結(jié)果是true或者false的表達(dá)式和一個(gè)當(dāng)條件是false的時(shí)候要展示的信息奕筐,比如:

?????????// In the implementation of a subscript...

? ? ? ? //引用于subscript的實(shí)現(xiàn)

????????precondition(index > 0, "Index must be greater than zero.")

? ? 你可以調(diào)用preconditionFailure(_:file:line:)函數(shù)來表明先決條件失敗了舱痘,例如,在一個(gè)swift語句的defaultcase里面离赫,所有有效的數(shù)據(jù)應(yīng)該在switch其他的case里面已經(jīng)被處理了芭逝,那么在defaultcase里面就可以使先決條件失敗。

NOET:如果編譯器在不檢查的模式(-Ounchecked)笆怠,先決條件不會(huì)被檢查铝耻。編譯器會(huì)假設(shè)所有的先決條件都是成功的誊爹。因此,編譯器會(huì)優(yōu)化你的代碼蹬刷。然而fatalError(_:file:line:)函數(shù)總是會(huì)停止執(zhí)行代碼,不理會(huì)是否有優(yōu)化的設(shè)置频丘。在編寫Demo或者開發(fā)的早期办成,可以為一些尚未完成的功能創(chuàng)造一些占位方法,并用fatalError("Unimplemented")作為占位方法的實(shí)現(xiàn)搂漠。因?yàn)楹蛿嘌曰蛘呦葲Q條件不一樣迂卢,致命的錯(cuò)誤是不會(huì)被優(yōu)化的,所以你可以確定當(dāng)碰到一些沒有實(shí)現(xiàn)的占位方法桐汤,程序總會(huì)因?yàn)榕龅街旅腻e(cuò)誤而停止運(yùn)行而克。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怔毛,隨后出現(xiàn)的幾起案子员萍,更是在濱河造成了極大的恐慌,老刑警劉巖拣度,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碎绎,死亡現(xiàn)場離奇詭異,居然都是意外死亡抗果,警方通過查閱死者的電腦和手機(jī)筋帖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冤馏,“玉大人日麸,你說我怎么就攤上這事〈猓” “怎么了赘淮?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長睦霎。 經(jīng)常有香客問我梢卸,道長,這世上最難降的妖魔是什么副女? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任蛤高,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戴陡。我一直安慰自己塞绿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布恤批。 她就那樣靜靜地躺著异吻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喜庞。 梳的紋絲不亂的頭發(fā)上诀浪,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音延都,去河邊找鬼雷猪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晰房,可吹牛的內(nèi)容都是我干的求摇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼殊者,長吁一口氣:“原來是場噩夢啊……” “哼与境!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猖吴,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摔刁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后距误,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體簸搞,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年准潭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趁俊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刑然,死狀恐怖寺擂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泼掠,我是刑警寧澤怔软,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站择镇,受9級特大地震影響挡逼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腻豌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一家坎、第九天 我趴在偏房一處隱蔽的房頂上張望嘱能。 院中可真熱鬧,春花似錦虱疏、人聲如沸惹骂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽对粪。三九已至,卻和暖如春装蓬,著一層夾襖步出監(jiān)牢的瞬間著拭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工矛物, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茫死,地道東北人跪但。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓履羞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屡久。 傳聞我的和親對象是個(gè)殘疾皇子忆首,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)被环,斷路器糙及,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 可選類型 在值可能不存在的情況下版姑,您可以使用可選類型柱搜。 一個(gè)可選類型代表兩種可能性:要么它有值,你可以通過解包來訪...
    Aaron_ZhangKH閱讀 1,956評論 0 2
  • 關(guān)于 Swift 重要這個(gè)文檔所包含的準(zhǔn)備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的剥险。這個(gè)信息可能會(huì)改變, 根據(jù)這個(gè)文...
    無灃閱讀 4,301評論 1 27
  • Swift語言開發(fā)指南 基礎(chǔ)部分 Swift是一門新的開發(fā)語言聪蘸,它可以在iOS、macOS watchOS以及tv...
    南風(fēng)_001閱讀 263評論 0 0
  • 選自2000年9月日記表制, 睡前慣例檢查門窗健爬,兒子隨后跟著,拉著我的手走到床邊的時(shí)候么介,突然抱著我的腿抬著小臉...
    靜_a587閱讀 323評論 0 0