一尘不染

快速“前提”和“断言”之间的区别?

swift

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

他们俩在我看来都一样。在哪种情况下,我们应该使用另一种?


阅读 249

收藏
2020-07-07

共1个答案

一尘不染

assert用于测试期间的健全性检查,而precondition用于防范可能发生的事情(如果发生),这意味着您的程序无法合理地进行。

因此,例如,您可以assert对具有合理结果的计算(例如在一定范围内)进行计算,以快速发现是否有错误。但是,您不希望随此附带它,因为超出范围的结果
可能 是有效的,并且不是至关重要的,因此不应崩溃您的应用程序(假设您只是使用它在进度栏中显示进度)。

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

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

前提

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

使用此功能可以检测到即使在运输代码中也必须阻止程序继续运行的情况。

  • 在运动场和-
    Onone构建中(Xcode的Debug配置的默认设置):如果condition评估为false,则在打印后以可调试状态停止程序执行message

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

  • 在-Ounchecked的版本中,condition不会进行评估,但是优化程序可能会假设 它将 评估为true。未能满足-
    Ounchecked构建中的假设是严重的编程错误。

断言

传统的C样式断言带有可选消息。

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

  • 在运动场和-
    Onone构建中(Xcode的Debug配置的默认设置):如果condition评估为false,则在打印后以可调试状态停止程序执行message

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

  • 在-Ounchecked的版本中,condition不会进行评估,但是优化程序可能会假设 它将 评估为true。未能满足-
    Ounchecked构建中的假设是严重的编程错误。

2020-07-07