Swift Precondition 预处理
前言
precondition和assert的格式类似,也是动态的,precondition会造成程序的提前终止并抛出错误信息。
1、Precondition
precondition在一般的代码中并不多见,因为它是动态的,只会在程序运行时进行检查,适用于哪些无法在编译期确定的风险情况。如果出现了诸如数据错误的情况,
precondition会提前终止程序,避免因数据错误造成更多的损失。如果条件判断为
true,代码运行会继续进行。如果条件判断为
false,程序将终止。assert是单纯地触发断言即停止程序,不会让你有机会将可能出错的设计走过它这一关。
1.1 Precondition 的定义
标准的断言格式
precondition(condition: Bool, message: String)
condition判断条件,message自定义调试信息,断言中的调试信息参数是可选的。
定义
public func precondition(_ condition: @autoclosure () -> Bool,
_ message: @autoclosure () -> String = default,
file: StaticString = #file,
line: UInt = #line) public func preconditionFailure(_ message: @autoclosure () -> String = default,
file: StaticString = #file,
line: UInt = #line) -> Never
1.2 Precondition 的使用
Swift 数组的下标操作可能造成越界,使用扩展的方式向其中增加一个方法来判断下标是否越界。
extension Array { func isOutOfBounds(index: Int) { precondition((0..<endIndex).contains(index), "数组越界") print("继续执行")
}
}
// 不越界的情况 [1, 2, 3].isOutOfBounds(index: 2) // 继续执行
// 越界的情况 [1, 2, 3].isOutOfBounds(index: 3) // Thread 1: Precondition failed: 数组越界
- 在满足
precondition条件的时候,程序会继续执行。 - 在不满足
precondition条件的时候,程序被终止,并且将precondition中预设的错误信息打印到了控制台上,precondition避免了一些无意义的操作。
- 在满足
Swift Precondition 预处理的更多相关文章
- swift 全局常量 && 全局变量的写法
在OC里面 如果 想设置一个全局常量 很简单 使用简单宏定义 就搞定了 例如: #define WEBAPIBASEURL @"http://www.baidu.com/" ...
- Swift学习笔记(一)
1.Constants and Variables(常量和变量) let定义常量,var定义变量. [Note] If a stored value in your code won't change ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- Swift语言快速入门
Swift语言快速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著 ISBN 978-7-121-24328-8 201 ...
- Swift 设计指南之 编程规范
基本准则 用法一目了然是你设计时最重要的目的. 方法和属性这样的实体只声明一次,却会被重复调用.因此你在设计 API 时应尽可能使其简单明了.当评估某个设计时,只阅读声明往往是不够的,有时还需要检查它 ...
- iOS - Swift 与 C 语言交互编程
前言 作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 1.基本 ...
- IOS开发之SWIFT进阶部分
概述 上一篇文章<iOS开发系列--Swift语言> 中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用 ...
- Swift学习笔记十三
初始化 初始化是一个在类.结构体或枚举的实例对象创建之前,对它进行预处理的过程,包括给那个对象的每一个存储式属性设定初始值,以及进行一些其他的准备操作. 通过定义初始化器(initializer)来实 ...
- Swift进阶
概述 访问控制 Swift命名空间 Swift和ObjC互相调用 Swift和ObjC映射关系 Swift调用ObjC ObjC调用Swift 扩展—Swift调用C 反射 扩展—KVO 内存管理 循 ...
随机推荐
- 如何解决海量数据的Top K问题
1. 问题描述 在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门 ...
- [ZJOI2010]贪吃的老鼠
很不错的一道网络流的题目 二分答案是显然的 首先不考虑每个饼干只能一个老鼠吃 那很显然的建图就是将时间点按照开始结束的点分成2*n-1段 然后对每一段时间建m个老鼠的点,然后s-它限流,再从它到目前可 ...
- Codeforces 815C Karen and Supermarket 树形dp
Karen and Supermarket 感觉就是很普通的树形dp. dp[ i ][ 0 ][ u ]表示在 i 这棵子树中选择 u 个且 i 不用优惠券的最小花费. dp[ i ][ 1 ][ ...
- BZOJ1592 POJ3666 [Usaco2008 Feb]Making the Grade 路面修整 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3666 题目传送门 - BZOJ1592 题意概括 整条路被分成了N段,N个整数A_1, ... , ...
- MooFest POJ1990
题意: 一群牛参加完牛的节日后都有了不同程度的耳聋,第i头
- AndroidStudio 之 Inter x86 Emulator Accelerator(Haxm installer) - not compatible with windows
- HDU-1421 搬寝室【dp】
题目链接:https://vjudge.net/contest/214662#problem/E 题目大意: ...
- python的pickle和shelve模块
python中用于序列化的模块总结 目录 pickle模块 shelve模块 xml模块 pickle模块 介绍 Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python, ...
- ThreadPoolExecutor 源码阅读
目录 ThreadPoolExecutor 源码阅读 Executor 框架 Executor ExecutorService AbstractExecutorService 构造器 状态 Worke ...
- MyBatis学习笔记2--配置环境详解
1.MyBatis-config.xml详解 一个完整的配置文件如下所示 <configuration> <!-- <properties resource="jdb ...