“先决条件”与“断言”之间的区别?

在Swift中, precondition(condition: Bool, message: String)assert(condition: Bool, message: String)什么区别?

他们两个都和我一样。 我们应该在哪种情况下使用一种?

assert是为了在testing期间进行健全性检查,而precondition是为了防范发生的事情,如果它们发生,就意味着你的程序不能合理地进行。

所以举个例子,你可能会把一些assert放在一些明显的结果上(比如在某些范围内),以便快速find是否有错误。 但是你不会想要这样做,因为越界的结果可能是有效的,而不是关键的,所以不应该使你的应用程序崩溃(假设你只是用它来显示进度条上的进度)。

另一方面,在获取元素时检查数组下标是否有效是一个precondition 。 当被问及一个无效的下标时,数组对象没有合理的下一个动作,因为它必须返回一个非可选的值。

来自文档的全文(尝试选项 – 单击Xco​​de中的assertprecondition ):

前提

检查取得进展的必要条件。

使用此function可检测即使在运输代码中也必须防止程序继续运行的情况。

  • 在操场和-Onone版​​本(Xcode的Debugconfiguration的默认版本)中:如果condition计算结果为false,则在打印message之后,将程序停止在可debugging状态。

  • 在-O构build中(Xcode的Releaseconfiguration的默认值):如果condition计算结果为false,则停止程序执行。

  • 在-Ounchecked构build中,不评估condition ,但优化器可能会认为它将评估为true 。 在-Ounchecked构build中未能满足这个假设是一个严重的编程错误。

断言

传统的C风格声明一个可选的消息。

使用此function进行内部健全性检查,这些检查在testing期间处于活动状态,但不会影响运输代码的性能。 检查发布版本中的无效使用情况; 看precondition

  • 在操场和-Onone版​​本(Xcode的Debugconfiguration的默认版本)中:如果condition计算结果为false,则在打印message之后,将程序停止在可debugging状态。

  • 在-O构build中(Xcode的Releaseconfiguration的默认值),不评估condition ,也没有效果。

  • 在-Ounchecked构build中,不评估condition ,但优化器可能会认为它将评估为true 。 在-Ounchecked构build中未能满足这个假设是一个严重的编程错误。

我发现Swift断言 – 缺less的手册是有帮助的

  debug release release function -Onone -O -Ounchecked assert() YES NO NO assertionFailure() YES NO NO** precondition() YES YES NO preconditionFailure() YES YES YES** fatalError()* YES YES YES 

从有趣的讨论Swift Evolution

– 断言:检查自己的代码内部错误

– 先决条件:检查你的客户给你有效的论点。

此外,您需要小心使用什么,请参阅assertionFailure和Optmization Level

precondition在发布模式下处于活动状态,所以当您发布应用程序时,前提条件失败,应用程序将终止。 默认情况下, Assert仅在debugging模式下工作。

我在NSHipster上发现了这个很好的解释:

断言是从古典逻辑中借鉴的一个概念。 在逻辑中,断言是关于certificate中命题的陈述。 在编程中,断言表示程序员在声明的地方对应用程序做出的假设。

当以前提条件和后置条件的forms使用这些前提条件和后置条件时,这些前提条件描述了在方法或函数执行的开始和结束时对代码状态的期望,断言形成了一个合同。 断言也可以用来在运行时强制执行条件,以便在某些先决条件失败时阻止执行。

前提

 func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default) 

检查取得进展的必要条件。

  1. 使用此function可检测即使在运输代码中也必须防止程序继续运行的情况。
  2. 在操场和-Onone版​​本(Xcode的Debugconfiguration的默认版本)中:如果条件计算结果为false,则在打印消息之后,将程序停止在可debugging状态。
  3. 在-O构build中(Xcode的Releaseconfiguration的默认值):如果条件计算结果为false,则停止程序执行。
  4. 在-Ounchecked构build中,不评估条件,但优化器可能会认为它将评估为true。 在-Ounchecked构build中未能满足这个假设是一个严重的编程错误。

断言

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

传统的C风格声明一个可选的消息。

  1. 使用此function进行内部健全性检查,这些检查在testing期间处于活动状态,但不会影响运输代码的性能。 检查发布版本中的无效使用情况; 看先决条件。

  2. 在操场和-Onone版​​本(Xcode的Debugconfiguration的默认版本)中:如果条件计算结果为false,则在打印消息之后,将程序停止在可debugging状态。

  3. 在-O构build中(Xcode的Releaseconfiguration的默认值),不评估条件,也没有效果
  4. 在-Ounchecked构build中,不评估条件,但优化器可能会认为它将评估为true。 在未经检查的版本中未能满足这个假设是一个严重的编程错误