断言

作者: 焦下客 | 来源:发表于2019-01-07 11:07 被阅读10次

断言(assertion)在Cocoa 开发里一般用来检查输入参数是否满足一定条件,并对其进行“论断”。这是一个编码世界中的哲学问题,我们代码的使用者(可能是别的程序猿,也有可能是未来的自己)很难做到在不知道实现细节的情况下对自己的输入进行限制。大多数时候编译器可以帮助我们进行输入类型的检查,但是如果代码需要在特定的输入条件下才能正确运行的话,这种更细致的条件就难以控制了。在超过边界条件的输入情况下,我们的代码可能无法正确工作,这就需要我们在代码实现中进行额外工作。

一种很容易想到的做法是在方法内部使用if这样的条件控制来检测输入,如果遇到无法继续的情况,就提前返回或者抛出错误。但是这样的做法无疑增加了API使用的复杂度,也导致了很多运行时的额外开销。对于像判定输入是否满足某种条件的运用情景,我们有更好的选择,那就是断言。

Swift 为我们提供了一系列的assert方法来使用断言,其中最常用的一个是:

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

在使用时,最常见的情况是给定条件和一个简单的说明。举一个在温度转换时候的例子,我们想要把摄氏温度转为开尔文温度的时候,因为绝对零度永远不能达到,所以我们不可能接受一个小于-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}

在遇到无法处理输入时,运行会产生错误,保留堆栈,并抛出我们预设的信息,用来提醒调用这段代码的用户。

断言的另一个优点是它是一个开放时的特性,只有在Debug编译的时候有效,而在运行时是不被编译执行的,因此断言并不会消耗运行时的性能。这些特点使得断言成为面向程序员的在调试开发阶段非常适合的调试判断,而在代码发布的时候,我们也不需要刻意去将这些断言手动清理掉,非常方便。

虽然默认情况下只在 Release 的情况下断言才会被禁用,但是有时候我们可能处于某些目的希望断言在调试开发时也暂时停止工作,或者是在发布版本中也继续有效。我们可以通过显式的添加编译标记达到这个目的。在对于target 的Build Setting中,我们在Swift Compiler - Custom Flags 中的Other Swift Flags 中添加 -assert-config Debug 来强制启用断言,或者-assert-config Release 来强制禁用断言。当然,除非有充足的理由,否则并不建议做这样的改动。如果我们需要在Release发布时在无法继续时将程序强行终止的话,应该选择使用fatalError。

相关文章

  • 客观断言和主观断言 阅读抄300

    客观断言和主观断言 在说明“结论”之前,我们先来区分客观断言和主观断言。客观断言(objective claim)...

  • Jmeter响应断言详解

    一、添加响应断言 选中需要进行断言的Sampler,右键添加 “断言” → “响应断言”。参数配置如下: 适用于:...

  • jmeter检查点

    1、添加响应断言,右键点击我们的“登录”页面---->添加---->断言---->响应断言 2. 设置响应断言 3...

  • 自学Swift之断言 assertion

    断言概念: 官方概念太无聊,并且冗余... 断言(assertion) 是一个全局函数 断言理解: 我理解的断言(...

  • Mock那些事儿(3):Mock的断言

    Mock的断言与unittest的断言不同,unittest的断言是判断结果是否正确,而mock的断言主要...

  • TestNG断言

    TestNG中的Assertion,也是断言。断言是测试中最难写的部分。 Assert类(硬断言) 断言类是Ass...

  • 2020-11-06 《批判性思维》day1 断言

    一、什么是断言? 在书中,断言是用来表达信念的,是一个陈述句,它可真可假。 二、类别 断言分为主观断言、客观断言这...

  • 一言力之断言力

    所谓断言,即明确表达说话人的意思;断言力,即敢于冒险提出断言的能力!断言力有什么用 通过断言,可以自然而然的产生一...

  • MAKE YOUR PREDICATE EXACT1

    使用准确的断言 仔细判断句子中的断言是否准确地断言了您想要断言的内容。比较这些句子,其中断言的部分是斜体: 和平已...

  • 批判性思维(一)

    1.客观断言与主观断言 在文章的开始,作者介绍两个非常有趣的定义。客观断言与主观断言,客观断言是认定的,固定的客观...

网友评论

      本文标题:断言

      本文链接:https://www.haomeiwen.com/subject/uowyrqtx.html