Swift5.1—断言和先决条件

简介: Swift5.1—断言和先决条件

断言和先决条件是在运行时所做的检查。你可以用他们来检查在执行后续代码之前是否一个必要的条件已经被满足了。如果断言或者先决条件中的布尔条件评估的结果为true(真),则代码像往常一样继续执行。如果布尔条件评估结果为false (假),程序的当前状态是无效的,则代码执行结束,应用程序终止。


断言帮助你在开发阶段找到错误和不正确的假设,先决条件帮助你在生产环境中探测到存在的问题。


断言和先决条件的不同点是,他们什么时候进行状态检测:断言仅在调试环境运行,而先决条件则在调试环境和生产环境中运行。在生产环境中,断言的条件将不会进行评估。这个意味着你可以使用很多断言在你的开发阶段,但是这些断言在生产环境中不会产生任何影响。


使用断言进行调试


你可以调用Swift标准库的assert(_:_:file:line:)函数来写一个断言。向这个函数传入一个结果为true或者false的表达式以及一条信息,当表达式的结果为false的时候这条信息会被显示。

let age = -3
//因为age<0,所以断言会触发
assert(age >=0,"A person's age cannot be less than zero")


如果不需要断言信息,可以就像这样忽略掉。

assert(age >= 0)


如果代码已经检查了条件,你可以使用assertionFailure(_:file:line:)函数来表明断言失败了。

if age > 10 {
          print("You can ride the roller-coaster  or the ferris wheel.")
}else if age > 0{
          print("You can ride the ferris wheel.")
}else{
          assertionFailure("A person's age can't be less than zero.")
}


强制执行先决条件


当一个条件可能为假,但是继续执行代码要求条件必须为真的时候,需要使用先决条件。例如使用先决条件来检查是否下标越界,或者来检查是否将一个正确的参数传给函数。

你可以使用全局precondition(_:_:file:line:)函数来写一个先决条件。向这个函数传入一个结果为true或者false的表达式以及一条信息,当表达式的结果为false的时候这条信息就会被显示。

//在下一个下标的实现里...
precondition(index > 0,"Index must be greater than zero.")


你可以调用preconditionFailure(_:file:line:)方法来表明出现了一个错误,例如,switch进入了default分支,但是所有的有效值应该被任意一个其他分支(非default分支)处理。


注:


如果你使用unchecked模式(-Ounchecked)编译代码,先决条件将不会进行检查。编译器假设所有的先决条件总是为true(真),他将优化你的代码。然而,fatalError(_:file:line:)函数总是中断执行,无论你怎么进行优化设定。


你能使用fatalError(_:file:line:)函数在设计原型和早期开发阶段,这个阶段只有方法的声明,但是没有具体实现,你可以在方法中写上fatalError("Unimplemented")作为具体实现。因为fatalError不会像断言和先决条件那样被优化掉,所以你可以确保当代码执行到一个没有被实现的方法时,程序会被中断。

目录
相关文章
|
弹性计算 安全 Linux
Linux服务器总是被暴力破解,用fail2ban来加强防护(用法详解)
Linux服务器总是被暴力破解,用fail2ban来加强防护(用法详解)
Linux服务器总是被暴力破解,用fail2ban来加强防护(用法详解)
|
10月前
|
人工智能 搜索推荐 机器人
AI+硬件最新资讯合集(2024-11-11第3期)
近期出现让大模型具备控制电脑和手机能力的智能体,掀起 “Computer Use Agents” 热潮。
|
数据采集 开发框架 数据挖掘
基于Python+Flask框架开发实现二手车数据爬取及分析
基于Python+Flask框架开发实现二手车数据爬取及分析
230 1
|
JSON 安全 关系型数据库
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
|
存储 人工智能 运维
|
缓存 iOS开发 索引
Xcode清理垃圾
Xcode清理垃圾
423 0
|
SQL 存储 关系型数据库
MySQL 如何使用SQL语句获取表结构和获取全部表名
MySQL 如何使用SQL语句获取表结构和获取全部表名
576 0
MySQL 如何使用SQL语句获取表结构和获取全部表名
|
JavaScript 前端开发 数据格式
Vue 2.x折腾记 - (16) 基于Ant Design Vue 封装一个配置式的表单搜索组件
这次的后台管理系统项目选型用了Vue来作为主技术栈; 因为前段时间用过React来写过项目(用了antd),感觉棒棒的。 所以这次就排除了Element UI,而采用了Ant Design Vue; 在分析整个项目原型后,发现又可以抽离类似之前的React表格搜索组件
1072 0
|
算法 计算机视觉
MMTracking 食用指南 | 多目标跟踪篇
MOT 旨在检测和跟踪视频中出现的物体。 与视频目标检测相比,MOT 更加侧重于对视频内的同一目标进行关联。
1136 0
MMTracking 食用指南 | 多目标跟踪篇
|
负载均衡 Java 数据处理
Flink 必知必会经典课程3:Flink Runtime Architecture
众所周知 Flink 是分布式的数据处理框架,用户的业务逻辑会以Job的形式提交给 Flink 集群。Flink Runtime作为 Flink 引擎,负责让这些作业能够跑起来并正常完结。这些作业既可以是流计算作业,也可以是批处理作业,既可以跑在裸机上,也可以在Flink集群上跑,Flink Runtime必须支持所有类型的作业,以及不同条件下运行的作业。
Flink 必知必会经典课程3:Flink Runtime Architecture