斷言

斷言(assertion)在Cocoa 開發(fā)里一般用來檢查輸入?yún)?shù)是否滿足一定條件联予,并對其進行“論斷”示姿。這是一個編碼世界中的哲學(xué)問題,我們代碼的使用者(可能是別的程序猿桐早,也有可能是未來的自己)很難做到在不知道實現(xiàn)細(xì)節(jié)的情況下對自己的輸入進行限制癣缅。大多數(shù)時候編譯器可以幫助我們進行輸入類型的檢查,但是如果代碼需要在特定的輸入條件下才能正確運行的話哄酝,這種更細(xì)致的條件就難以控制了友存。在超過邊界條件的輸入情況下,我們的代碼可能無法正確工作陶衅,這就需要我們在代碼實現(xiàn)中進行額外工作屡立。

一種很容易想到的做法是在方法內(nèi)部使用if這樣的條件控制來檢測輸入,如果遇到無法繼續(xù)的情況搀军,就提前返回或者拋出錯誤膨俐。但是這樣的做法無疑增加了API使用的復(fù)雜度,也導(dǎo)致了很多運行時的額外開銷罩句。對于像判定輸入是否滿足某種條件的運用情景焚刺,我們有更好的選擇,那就是斷言门烂。

Swift 為我們提供了一系列的assert方法來使用斷言乳愉,其中最常用的一個是:

fun assert(@autoclosure condition: () -> Bool,
                  @autoclosure _ message: () -> String = default,
                                                      file: StaticString = default,
                                                      line: UInt = default)

在使用時,最常見的情況是給定條件和一個簡單的說明屯远。舉一個在溫度轉(zhuǎn)換時候的例子蔓姚,我們想要把攝氏溫度轉(zhuǎn)為開爾文溫度的時候,因為絕對零度永遠(yuǎn)不能達到慨丐,所以我們不可能接受一個小于-273.15攝氏溫度作為輸入:

func convertTokelvin(# celsius: Double) -> Double{
      assert(celsius > absoluteZeroInCelsius,"輸入的攝氏溫度不能低于絕對零度")
      return celsius - absoluteZeroInCelsius
}

let roomTemperature = convertToKelvin(celsius: 27)
// roomTemperature = 300.15
let tooCold = convertToKelvin(celsius: -300)
// 運行時錯誤
// assertion failed:
// 輸入的攝氏溫度不能低于絕對零度: file{YOUR_FILE_PATH}, line {LINE_NUMBER}

在遇到無法處理輸入時坡脐,運行會產(chǎn)生錯誤,保留堆棧房揭,并拋出我們預(yù)設(shè)的信息备闲,用來提醒調(diào)用這段代碼的用戶晌端。

斷言的另一個優(yōu)點是它是一個開放時的特性,只有在Debug編譯的時候有效浅役,而在運行時是不被編譯執(zhí)行的斩松,因此斷言并不會消耗運行時的性能。這些特點使得斷言成為面向程序員的在調(diào)試開發(fā)階段非常適合的調(diào)試判斷觉既,而在代碼發(fā)布的時候惧盹,我們也不需要刻意去將這些斷言手動清理掉,非常方便瞪讼。

雖然默認(rèn)情況下只在 Release 的情況下斷言才會被禁用钧椰,但是有時候我們可能處于某些目的希望斷言在調(diào)試開發(fā)時也暫時停止工作,或者是在發(fā)布版本中也繼續(xù)有效符欠。我們可以通過顯式的添加編譯標(biāo)記達到這個目的嫡霞。在對于target 的Build Setting中,我們在Swift Compiler - Custom Flags 中的Other Swift Flags 中添加 -assert-config Debug 來強制啟用斷言希柿,或者-assert-config Release 來強制禁用斷言诊沪。當(dāng)然,除非有充足的理由曾撤,否則并不建議做這樣的改動端姚。如果我們需要在Release發(fā)布時在無法繼續(xù)時將程序強行終止的話,應(yīng)該選擇使用fatalError挤悉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渐裸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子装悲,更是在濱河造成了極大的恐慌昏鹃,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诀诊,死亡現(xiàn)場離奇詭異洞渤,居然都是意外死亡,警方通過查閱死者的電腦和手機属瓣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門您宪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奠涌,你說我怎么就攤上這事×仔樱” “怎么了溜畅?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長极祸。 經(jīng)常有香客問我慈格,道長怠晴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任浴捆,我火速辦了婚禮蒜田,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘选泻。我一直安慰自己冲粤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布页眯。 她就那樣靜靜地躺著梯捕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窝撵。 梳的紋絲不亂的頭發(fā)上傀顾,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音碌奉,去河邊找鬼短曾。 笑死,一個胖子當(dāng)著我的面吹牛赐劣,可吹牛的內(nèi)容都是我干的嫉拐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼隆豹,長吁一口氣:“原來是場噩夢啊……” “哼椭岩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起璃赡,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤判哥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碉考,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塌计,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年侯谁,在試婚紗的時候發(fā)現(xiàn)自己被綠了锌仅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡墙贱,死狀恐怖热芹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惨撇,我是刑警寧澤伊脓,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站魁衙,受9級特大地震影響报腔,放射性物質(zhì)發(fā)生泄漏株搔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一纯蛾、第九天 我趴在偏房一處隱蔽的房頂上張望纤房。 院中可真熱鬧,春花似錦翻诉、人聲如沸炮姨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剑令。三九已至,卻和暖如春拄查,著一層夾襖步出監(jiān)牢的瞬間吁津,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工堕扶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碍脏,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓稍算,卻偏偏與公主長得像典尾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子糊探,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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