Swift Assert 断言
前言
对每次运行都会出现的错误通常不会过于苦恼,可以使用断点调试或者
try catch之类的方式判断并修复它。但是一些偶发(甚至是无数次运行才会出现一次)的错误单靠断点之类的方式是很难排除掉的,为此,引入一个不是很常用的调试工具函数assert。在实际编码中,为了保证程序正常运行,只有在某些必要条件被满足的情况下才执行特定代码段,这种编程思想叫做 “防错性编程”。
1、断言
在 Swift 语言中可以调用全局的
assert函数来增加一个断言,这里的全局意思是你可以将断言放在你程序的任何一个地方,程序在执行到assert时会判断其中的逻辑条件表达式参数是否为true。- 如果条件判断为
true,代码运行会继续进行。 - 如果条件判断为
false,程序将终止。 assert是单纯地触发断言即停止程序,不会让你有机会将可能出错的设计走过它这一关。
- 如果条件判断为
通常在为程序加入并触发断言后,Xcode 会精确定位到异常代码段,并反馈异常信息等修改 bug 必须的调试信息。
1.1 Assert 的定义
标准的断言格式
assert(condition: Bool, message: String)
condition判断条件,message自定义调试信息,断言中的调试信息参数是可选的。
定义
public func assert(_ condition: @autoclosure () -> Bool,
_ message: @autoclosure () -> String = default,
file: StaticString = #file,
line: UInt = #line) public func assertionFailure(_ message: @autoclosure () -> String = default,
file: StaticString = #file,
line: UInt = #line)
系统在断言的源代码中加入了类似
#if NDEBUG这样的编译字,使其只能用于 debug 期,当你在发布 release 版本或者更新版的时候,编译器会使用一个编译字段将断言无效化,所以当你的产品在提交给用户之后还需要继续收集错误信息时,需使用其他方式。断言函数中用到了
@autoclosure属性,使用这种属性的参数意味着我们可以在这个参数的位置传入一个表达式,这个表达式会被自动封包成一个闭包,这也正是其字面的意思 “自动闭包”。在assert函数中它起到的作用也是非常明显的,如果在这里我们使用的是普通的布尔型参数,那么在执行到 assert 函数时,就会先运算条件表达式的值,而使用@autoclosure属性后,程序会先在assert函数内判断 debug 期的编译字是否存在,如果存在才会运算条件表达式的值,当然,这时条件表达式已经被自动封装成了一个闭包。
1.2 Assert 的使用
断言使用的几种场景
- 验证参数的合法性。
- 将要使用一个对象,但是不确定其是否已经正确创建。
- 数组或者其他集合类、字典等复杂数据类型下标没有处于安全范围导致可能会越界。
assert函数的条件表达式参数最好一次只判断一个条件,因为如果判断多个条件,当断言被触发时,往往会无法直观的判断到底是哪一个条件不被满足。使用
// 满足条件 var usedate = -1
assert(usedate <= 0, "超出试用期,不能启动程序!") // 继续执
print("继续执行")
// 不满足条件 // 当 usedate 大于 0 时,程序中断,进入断言函数打印调试信息
usedate = 2
assert(usedate <= 0, "超出试用期,不能启动程序!") // Thread 1: Assertion failed: 超出试用期,不能启动程序!
Swift Assert 断言的更多相关文章
- Spring Assert 断言
Assert(断言)的初步理解构思 Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查, ...
- C++ ASSERT() 断言机制
C++ ASSERT() 断言机制 ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行.如果表达式不为0,则继 ...
- Idea中开启assert断言
先打开相应的配置面板,有以下两种方式. 然后在VM栏里输入 -enableassertions 或者 -ea 就好了 然后编写程序试试 我的目录结构如下:(因为Main class那里要写类的全限 ...
- Spring Framework 的 Assert断言
知识共享才能传播,博采众家之长,才能推陈出新!-- 参考 https://www.cnblogs.com/hwaggLee/p/4778101.html 一.什么是 Assert(断言)? Web 应 ...
- Python全栈开发之---assert断言
一.python assert的作用: 根据Python 官方文档解释(https://docs.python.org/3/reference/simple_stmts.html#assert), & ...
- Python assert 断言函数
http://blog.csdn.net/hunyxv/article/details/52737339 使用assert断言是学习python一个非常好的习惯,python assert 断言句语格 ...
- pytest自动化7:assert断言
前言:assert断言就是将实际结果和期望结果做对比,符合预期结果就测试pass,不符合预期就测试failed. 实例1:简单断言 实例1优化版--增加异常信息文字描述 异常断言 excinfo 是一 ...
- Python assert(断言)
Python assert(断言)可以分别后面的判断是否正确,如果错误会报错 示例: a = 1 assert type(a) is int print('No problem') 输出结果: No ...
- 关于java中assert(断言)的使用讲解
说明:写的不是很全面,有任何问题请留言,多交流,谢谢! 1.eclipse.myeclipse开启assert(断言),默认是关闭,如下: 说白了就是设置一下jvm的参数,参数是-ea或者-enabl ...
随机推荐
- Codeforces Round #469 (Div. 2)
Codeforces Round #469 (Div. 2) 难得的下午场,又掉分了.... Problem A: 怎么暴力怎么写. #include<bits/stdc++.h> #de ...
- 删除input上传的文件路径
上传文件时,选择了文件后想清空文件路径,搜索了一下,用两种方法解决 <input type="file" id="fileupload" name=&qu ...
- Color the ball HDU1556
这题整整debug了两个小时 不同组居然要初始化 本以为built函数里面已经初始化好了!!!!! 其他无需注意 #include<cstdio> #include<cstring ...
- 6-14 Abbott的复仇 uva816
我的第一题bfs 将方向固定 NESW 然后左转和右转就是+3和+1!!! 还有就是 建立一个数组 储存父节点 这样就可以往回打印出路径 打印的截至条件是 d[][][]==0时 说明到 ...
- (转)python中调用R语言通过rpy2 进行交互安装配置详解
python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753 python中调用R语言通过r ...
- linux centOS服务器部署ssh,免密码登陆linux
登陆centos,切换用户,切换到你要免密码登陆的用户,进入到家目录 2 创建钥匙, [xun@jzlinux ~]$ ssh-keygen -t rsa Generating public/priv ...
- HDU 5391 Zball in Tina Town【威尔逊定理】
<题目链接> Zball in Tina Town Problem Description Tina Town is a friendly place. People there care ...
- AGC 027C.ABland Yard(拓扑/二分图)
题目链接 \(Description\) 给定一张图(可能存在自环),每个点上有A或B.求是否存在一条路径,使得在上面不断走,能够得到所有AB串组合(可以重复经过点). \(n\leq2\times1 ...
- php 解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别
GET: 请求指定的页面信息,并返回实体主体.HEAD: 只请求页面的首部.POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体.PUT: 从客户端向服务器传送的数据取代指定的文档 ...
- C++学习笔记43:STL
STL简介(standard Template Library) STL的基本组件:容器(container),迭代器(iterator),函数对象(function object) 算法(algor ...