Swift断言在生产应用程序中的行为

我正在阅读Swift电子书中的Assertions部分,它看起来像断言的工作非常类似于他们的Objective-C同行。 然而,在文档中没有任何地方可以find关于作为生产应用程序运行时的运行时行为的任何信息。 Objective-C的NSAssert承诺不会由于断言失败而终止生产应用程序。 在Swift中是这样吗?

根据苹果在他们的文档中使用的语言,我会说生产环境中的断言是被忽略的。

如果您的代码在debugging环境中运行时触发断言,例如在Xcode中构build和运行应用程序时,您可以确切地看到发生无效状态的位置,并在断言触发时查询您的应用程序的状态。 一个断言还可以让你提供一个适当的debugging信息,以断言的性质。

而在“注意”块中:

断言会导致您的应用程序终止,并且不能代替devise代码的方式,从而导致不可能出现无效条件。 尽pipe如此,在可能出现无效条件的情况下,断言是在您的应用程序发布之前确保在开发过程中突出显示并注意到这些情况的有效方法

debugging和释放之间的差异是编译器参数之间的差异。 最可能的答案是会有一些特殊的编译器设置(类似于Java中的-ea )。

编辑
Swift编译器有一个名为-assert-config的参数

-assert-config指定assert_configurationreplace。 可能的值是debugging,发布,replace。

Release ,断言被忽略。 不清楚DebugReplacement之间的区别。

在这里输入图像说明

在Swift标准库文档中logging断言和前提条件。

  • debugging – >停止断言失败。
  • 释放 – >忽略断言编译
  • 释放和“禁用安全检查” – >假设所有的断言语句都是编译器的真相和提示语句,以便只有在断言失败的条件下才能删除以下和前面的代码。 这意味着如果你按照代码断言处理exception情况,可能会被忽略。 如果断言失败,则行为完全未定义。

我没有检查,但“禁用安全检查”可能与@Sulthan提到的-assert-configreplace相关联。

检查您的Optimization Level ,并确保它不是Onone的发布configuration。 看我的说明https://github.com/onmyway133/blog/issues/39