swift中"前置条件"和"断言"之间的区别?

Cha*_*uan 93 swift

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

他们两个看起来都一样.我们应该在哪种情况下使用其中一种?

Air*_*ity 114

assert是为了在测试过程中进行健全性检查,而是precondition用于防止事情发生,如果它们发生,则意味着您的程序无法合理地进行.

因此,举例来说,你可能会assert在某些计算中得到明智的结果(比如在某些范围内),以便快速找到你是否有错误.但是你不想附带这个,因为越界结果可能是有效的,并且不重要所以不应该崩溃你的应用程序(假设你只是用它来显示进度条中的进度).

另一方面,在获取元素时检查数组上的下标是否有效precondition.当要求输出无效的下标时,数组对象没有合理的下一个操作,因为它必须返回非可选值.

来自文档的全文(尝试选项单击assertprecondition在Xcode中):

前提

检查前进的必要条件.

使用此功能可以检测必须阻止程序在运输代码中继续运行的条件.

  • 在playgrounds和-Onone构建中(Xcode的Debug配置的默认值):如果condition计算结果为false,则在打印后停止以可调试状态执行程序message.

  • 在-O构建中(Xcode的Release配置的默认值):如果condition求值为false,则停止程序执行.

  • 在-Ounchecked构建中,condition不会对其进行评估,但优化程序可能会认为它评估为true.未能在-Ounchecked构建中满足该假设是一个严重的编程错误.

断言

传统的C风格断言带有可选消息.

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

  • 在playgrounds和-Onone构建中(Xcode的Debug配置的默认值):如果condition计算结果为false,则在打印后停止以可调试状态执行程序message.

  • 在-O构建(Xcode的Release配置的默认值)中, condition不进行评估,并且没有任何影响.

  • 在-Ounchecked构建中,condition不会对其进行评估,但优化程序可能会认为它评估为true.未能在-Ounchecked构建中满足该假设是一个严重的编程错误.

  • "但是你不想随身携带它,因为越界结果*可能*有效,而且不重要所以不应该崩溃你的应用程序"这对我来说非常模糊.请问你能举一个确切的例子吗?也许是一些代码. (2认同)
  • 回答你的问题,我个人使用断言来捕捉在我编写和测试时我的构建中不应该发生的事情.想象一下一个读取JSON的守护声明,其中`data ["name"]`不存在,但它应该存在.在守卫内部有一个断言.{} {} {} {...}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} 类似地,如果这个代码正在生产中,断言不会使程序崩溃,并且我使用的任何备份代码(`return nil`)将接管. (2认同)
  • 难道你不应该检查索引而不做任何事情而不是让整个应用程序崩溃吗? (2认同)

onm*_*133 75

我发现Swift断言 - 缺少有用的手册

                        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
Run Code Online (Sandbox Code Playgroud)

有趣的Swift Evolution讨论开始

- 断言:检查自己的代码是否存在内部错误

- 前提条件:检查您的客户是否给了您有效的参数.

此外,您需要注意使用的内容,请参阅assertionFailure和Optimization Level


Gre*_*reg 10

precondition所以当您运送您的应用程序是在发布模式活跃的前提失败的应用程序将终止. Assert默认情况下仅在调试模式下工作.

我在NSHipster上使用它时发现了这个很好的解释:

断言是从经典逻辑中借鉴的概念.在逻辑中,断言是关于证明中的命题的陈述.在编程中,断言表示程序员在声明它们的地方对应用程序做出的假设.

当在前提条件和后置条件的容量中使用时,它描述了在方法或函数的执行开始和结束时对代码状态的期望,断言形成契约.断言还可用于在运行时强制执行条件,以防止在某些先决条件失败时执行.


13t*_*ost 6

前提

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

检查前进的必要条件.

  1. 使用此功能可以检测必须阻止程序在运输代码中继续运行的条件.
  2. 在playgrounds和-Onone构建中(Xcode的Debug配置的默认值):如果condition的计算结果为false,则在打印消息后停止程序在可调试状态下执行.
  3. 在-O构建中(Xcode的Release配置的默认值):如果condition的计算结果为false,则停止程序执行.
  4. 在-Ounchecked构建中,不评估条件,但优化器可能会认为它将评估为true.未能在-Ounchecked构建中满足该假设是一个严重的编程错误.

断言

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

传统的C风格断言带有可选消息.

  1. 使用此功能进行内部健全性检查,这些检查在测试期间处于活动状态,但不会影响运输代码的性能.检查发布版本中的无效用法; 看前提条件.

  2. 在playgrounds和-Onone构建中(Xcode的Debug配置的默认值):如果condition的计算结果为false,则在打印消息后停止程序在可调试状态下执行.

  3. 在-O构建(Xcode的Release配置的默认值)中,不评估条件,并且没有效果
  4. 在-Ounchecked构建中,不评估条件,但优化器可能会认为它将评估为true.在-Ounchecked版本中未能满足该假设是一个严重的编程错误