断言和先决条件(Assertions and Preconditions)

    断言和先决条件发是运行时发生的检测。使用它们可以确保在执行后面的代码之前已经满足了条件。如果断言或者先决条件中的值是true,代码像原来一样继续执行。如果条件是false,程序当前的状态就是无效的,代码会结束执行,app也会停止运行。

    使用断言和先决条件来表现出你编写代码的时候做的假设和希望,并让他们成为你代码的一部分。断言帮助你在开发过程中发现错误和不合适的假设。先决条件帮助你在生产环境下检测问题。

    除了在运行时验证你的期望,断言和先决条件也可以成为代码中的文档,这很有用。和上一章讨论的错误处理不一样,断言和先决条件不是用来处理可恢复的或者预期会发生的错误的。因为当一个断言或者先决条件失败了,那么程序当前的状态就是无效的,没有办法捕获一个发生了错误的断言。

    使用断言或者先决条件,不是为了把代码设计成不会出现不符合条件的样子。使用它们加强数据和状态的有效性使你可以预见到app在出现不可用状态的时候会导致结束,也使问题更加容易被调试。只要侦测到异常就结束执行也可以最小化无效的状态带来的危害。

    断言和先决条件的不同之处在于它们检测的时机不一样:断言只在调试模式中检测,先决条件在调试模式和产品模式都会检测。在产品模式下,断言中的条件不会被检测,也就是说在开发过程中,无论使用多少断言,都不会影响最后的产品的性能。


使用断言调试(Debugging with Assertions)

    我们通过调用Swift标准库的assert(_:_:file:line:)方法来书写断言。传入一个结果是true或者false的表达式和一个当条件是false的时候要展示的信息,比如:

        let age = -3

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

        // 这个断言会失败, 应该 -3  >= 0 结果是false.

    这个例子中,如果 age>=0是true,也就是age如果是一个非负数,代码会继续执行。如果age的值是一个负数,在上面的代码中,age>=0就是false,然后断言会失败,应用会结束。

    你也可以省略断言的信息,比如,只是需要重复检查条件:

        assert(age >= 0)

    如果代码中已经检查了条件,你可以使用assertionFailure(_:file:line:)函数表明这个断言失败了,比如:

        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.")

        }

强制执行先决条件(Enforcing Preconditions)

    当条件有可能是false的情况下,使用先决条件,但是需要确定只有当条件是true的时候你的代码才会继续执行。例如,使用先决条件判断一个下标是不是越界了,或者检查入参是不是有效。

    可以通过调用precondition(_:_:file:line:)函数书写先决条件。传入一个结果是true或者false的表达式和一个当条件是false的时候要展示的信息,比如:

         // In the implementation of a subscript...

        //引用于subscript的实现

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

    你可以调用preconditionFailure(_:file:line:)函数来表明先决条件失败了,例如,在一个swift语句的defaultcase里面,所有有效的数据应该在switch其他的case里面已经被处理了,那么在defaultcase里面就可以使先决条件失败。

NOET:如果编译器在不检查的模式(-Ounchecked),先决条件不会被检查。编译器会假设所有的先决条件都是成功的。因此,编译器会优化你的代码。然而fatalError(_:file:line:)函数总是会停止执行代码,不理会是否有优化的设置。在编写Demo或者开发的早期,可以为一些尚未完成的功能创造一些占位方法,并用fatalError("Unimplemented")作为占位方法的实现。因为和断言或者先决条件不一样,致命的错误是不会被优化的,所以你可以确定当碰到一些没有实现的占位方法,程序总会因为碰到致命的错误而停止运行。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容