Answers:
assert
用于测试期间的健全性检查,而precondition
用于防范可能发生的事情(如果发生),这意味着您的程序无法合理进行。
因此,例如,您可以assert
对具有合理结果的计算(例如在一定范围内)进行计算,以快速发现是否有错误。但是,您不希望附带此功能,因为超出范围的结果可能是有效的,并且不是至关重要的,因此不应使您的应用程序崩溃(假设您只是使用它在进度栏中显示进度)。
另一方面,在获取元素时检查数组的下标是否有效是precondition
。当请求无效的下标时,数组对象没有合理的下一步操作,因为它必须返回一个非可选值。
来自文档的全文(尝试单击assert
并precondition
在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构建中的假设是严重的编程错误。
data["name"]
,它读取不存在但应该存在的JSON 。在后卫中有一个断言..else {}可以使我崩溃并引起问题,从而帮助我捕获错误。同样,如果该代码正在生产中,则断言不会使程序崩溃,而我使用的任何备份代码(return nil
)都将接管。
我发现了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
–断言:检查您自己的代码是否存在内部错误
–前提条件:用于检查您的客户是否给了您有效的参数。
另外,您需要注意使用什么,请参见assertionFailure和Optimization Level
precondition()
,preconditionFailure()
它们具有相同的行为。这些函数之间的区别是:precondition
在内部需要条件,而preconditionFailure
只是抛出条件。
在precondition
当你船您的应用程序是在发布模式,所以你主动和先决条件未能应用程序将终止。
Assert
默认情况下仅在调试模式下工作。
我在NSHipster上使用它时发现了一个很好的解释:
断言是从经典逻辑中借用的一个概念。在逻辑上,断言是关于证明内命题的陈述。在编程中,断言表示程序员在声明它们的地方对应用程序所做的假设。
当以前置条件和后置条件的形式使用时,它们描述了在方法或函数执行的开始和结束时对代码状态的期望,则断言形成合同。断言还可以用于在运行时强制执行条件,以防止在某些先决条件失败时执行。
前提
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
检查取得进步的必要条件。
断言
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
传统的C样式断言带有可选消息。
使用此功能可进行内部完整性检查,这些检查在测试过程中处于活动状态,但不会影响运输代码的性能。检查发行版本中的无效用法;参见前提条件。
在操场上,-Onone构建(Xcode的Debug配置的默认设置):如果条件评估为false,则在打印消息后以可调试状态停止程序执行。
只是想加我的2美分。您可以根据需要在代码中添加任意多个断言。您可以使用这些断言发送代码。Swift不会为生产应用评估这些代码块。这些仅在调试模式下进行评估。
还要附加来自swift.org的图像
另请注意,前提条件并非如此。如果前提条件未评估为真,则附带前提条件的代码将崩溃,并且应用程序将终止。
简而言之,断言用于调试,但可以在不影响生产的情况下进行传送。断言将在调试模式下评估,而不在生产环境下评估。
和
前提条件用于确保生产环境中不会发生意外情况。这些条件将被评估,并在评估为假的情况下终止您的应用