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

我觉得他们两个看起来都一样.在哪种情况下,我们应该使用一个而不是另一个?

推荐答案

assert用于测试期间的健康判断,而precondition用于防止发生可能意味着程序无法合理进行的事情.

例如,你可以在一些有合理结果的计算中加assert(比如在一定范围内),以快速发现是否有错误.但是你不想附带它,因为越界结果might是有效的,并且不是关键的,所以不应该让你的应用崩溃(假设你只是用它在进度条中显示进度).

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

文档全文(请try 在Xcode中单击assertprecondition选项):

Precondition

判断前进的必要条件.

使用此功能可检测必须防止故障的情况

  • 在操场和-Onone构建中(Xcode调试的默认设置

  • In-O版本(Xcode发布配置的默认版本):

  • 在判断过的版本中,不判断condition,但

Assert

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

使用此功能进行活动的内部健全性判断

  • 在操场和-Onone构建中(Xcode调试的默认设置

  • In-O构建(Xcode发布配置的默认版本),

  • 在判断过的版本中,不判断condition,但

Swift相关问答推荐

防止NavigationLink自行返回导航视图

对多个项目的数组进行排序

如何在向照片添加文本时定义文本对齐、文本背景的Alpha和在文本之前添加图像

向文本元素添加背景色失败

ARRaycast Query和前置摄像头(ARFaceTrackingConfiguration)

可选,类似于自定义类型的初始化

如何在SwiftUI的文本视图中显示NSMutableAttributedString?

ToolbarItem 包含在动画中但不应该包含在动画中

将 ArgumentParser 与 Swift 并发一起使用

关于变量的视图的 SwiftUI 生命周期

格式化大货币数字

如何使用 ISO 国家代码(2 个字母)查找区域设置标识符

自定义 DispatchQueue 服务质量

这是 Int64 Swift Decoding 多余的吗?

Swift-如何接受多个(联合)类型作为参数

如何更改 Picker 的边框 colored颜色

如何以快速 Select 器菜单样式调整图像大小

理解 Swift 2.2 Select 器语法 - #selector()

swift 3 错误:参数标签 '(_:)' 不匹配任何可用的重载

我可以在 Swift 中为泛型类型 T 分配默认类型吗?