Swift开发第一篇——异常处理及断言
本篇分两部分:
1、错误和异常处理
2、Swift 中的断言
1、错误和异常处理
在 OC 开发中,我们通常会将 error 置为 nil
NSError *error;
BOOL success = [data writeToFile: path options: options error: &error];
if(error) {
// 错误信息
}
在绝大多数情况下,这个方法并不会发生什么错误,所以我们将 error 直接设置为 nil。但是出错的时候可能就会无从下手进行调试。在 Swift 中引入了异常机制,这让我们老牌程序员感到异常亲切,因为在 java 或 C# 中我们会经常使用。但是与 java 不同的是,Swift 中用的是 do...catch 语法,然后在可能跑出异常的地方来用 try 进行修饰,而 java 中直接将可能抛出异常的代码块放到 try...catch 中。swift 相较 java 会更快速的锁定异常代码的行数,而 java 可能需要一步步调试才能发现 try...catch 中那句发生了错误,但我并不认为这是个优点,如果 Swift 中多处都会抛出同样的异常,每句都去修饰的话会导致代码异常臃肿。
enum LoginError: ErrorType {
case UserNotFound, UserPasswordNotMatch
}
func login(user: String, password: String) throws {
if < {
throw LoginError.UserNotFound
}
if > {
throw LoginError.UserPasswordNotMatch
}
print("Login successfully.")
}
do {
try login("onevcat", password: "")
} catch LoginError.UserNotFound {
print("UserNotFound")
} catch LoginError.UserPasswordNotMatch {
print("UserPasswordNotMatch")
}
2、Swift 中的断言
断言(assertion)在 Cocoa 开发里一般用来在检查输入参数是否满足一定条件,并对其进行“论断”,用于提高开发人员之间的沟通效率。
在判断某些输入参数是否满足条件时,我们程序员通常用 if 这样的条件控制来检测,如果遇到无法继续的情况就提前返回或跑出错误。但是这样导致了运行时的额外开销,对于像判断输入参数是否满足条件这样的情景,我们用断言处理将会更好。
swift 中为我们提供的断言方法:
func assert(@autoclosure condition: () -> Bool,
@autoclosure _ message: () -> String = default,
file:StaticString = default,
line: UInt = default)
举一个简单的例子,比如我们的年龄不能小于0岁:
func convertAge(age: Int) -> Int {
assert(age < , "输入的年龄不能小于0岁")
return
}
let xiaoMingAge = convertAge(-)
// 运行时错误:
// assertion failed:
// 输入的年龄不能小于0岁
断言最最基本的作用:
在遇到无法处理的输入时,运行会产生错误并抛出我们预设的信息来提醒调用这段代码的工程师。
断言的特点:
与我们自定义的 NSLog 类似,它是一个开发时的特性,只有在 Debug 编译的时候有效,而在运行时是不被编译执行的,因此并不会消耗运行时的性能。这些特点使得断言称为面向程序员在调试开发阶段非常适合的调试判断,而在代码发布时,我们也不需要刻意去把这些断言手动清除。
如果我们想要在 Debug 模式下强制禁用断言,在对应的 target 的 Build Setting 中,我们在 Swift Compiler - Custom Flags 中的 Other Swift Flags 中添加 -assert-config Release 来强制禁用断言,或者 -assert-config Debug 来强制启用断言。(不建议这么做)
注:OC 中的断言函数 NSAssert 在 Swift 中已被移除。
Swift开发第一篇——异常处理及断言的更多相关文章
- swift开发多线程篇 - 多线程基础
swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread 使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...
- iOS开发——高级技术精选&底层开发之越狱开发第一篇
底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...
- Android百度地图开发-第一篇:申请、搭建百度地图
一.前言 这是第一篇关于Android使用百度地图的学习记录,主要记录: 1.在百度地图开发者平台上申请API Key. 2.在自己的应用中加入百度地图的Android版SDK. 3.在自己的应用中显 ...
- swift开发网络篇—NSURLConnection基本使用
iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...
- Swift开发第二篇——extension及fatalError
本篇分两部分: 一.extension在 Swift 中的使用 二.Swift 中的 fatalError 一.extension在 Swift 中的使用 在 swift 中我们可以通过 extens ...
- android 串口开发第一篇:搭建ndk开发环境以及第一个jni调用程序
一:ndk环境搭建 1:开发环境 我使用的是android studio 2.3.3版本,搭建ndk开发环境比较简单,打开File----Settings----Appearance&Beha ...
- python开发第一篇:初识python
一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...
- Swift开发第九篇——Any和AnyObject&typealias和泛型接口
本篇分为两部分: 一.Swift中的Any和AnyObject 二.Swift中的typealias和泛型接口 一.Swift中的Any和AnyObject 在 Swift 中,AnyObject 可 ...
- PowerBI开发 第一篇:设计PowerBI报表
PowerBI是微软新一代的交互式报表工具,把相关的静态数据转换为酷炫的可视化的,能够根据filter条件,对数据执行动态筛选,从不同的角度和粒度上分析数据.PowerBI主要由两部分组成:Power ...
随机推荐
- sqlserver -- 学习笔记(五)查询一天、一周、一个月记录(DateDiff 函数)(备忘)
Learn From : http://bjtdeyx.iteye.com/blog/1447300 最常见的sql日期查询的语句 --查询当天日期在一周年的数据 ) --查询当天的所有数据 ) -- ...
- swift实现冒泡排序
刚刚坐着没事干,就用swift语言写了写冒泡排序,还望高手指点.拍砖!哈哈! 废话不多说,上代码! import Cocoa var array = [,,,,,,,,,,,,,,,,,] print ...
- Python单元测试框架之pytest---如何执行测试用例
介绍 pytest是一个成熟的全功能的Python测试工具,可以帮助你写出更好的程序. 适合从简单的单元到复杂的功能测试 l 模块化parametrizeable装置(在2.3,持续改进) l 参 ...
- Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...
- JAVA生成随机数种子的方法
Java里面有一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结: Java中存在着两种Random函数: 一. ...
- dock基本使用
通过Docker源安装最新版本通过Docker源安装最新版本 要安装最新的 Docker 版本,首先需要安装 apt-transport-https 支持,之后通过添加源来安装.要安装最新的 Dock ...
- 组合数学 - 母函数的运用 --- hdu 1709 :The Balance
The Balance Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- .net接口学习笔记
1.接口的声明 接口的声明不能包含:数据成员,静态变量:只能包含如下类型的静态成员函数的声明:方法,属性,事件,索引器.声明中不能包含任何实现的代码,而在每个成员成名的主体后,必须使用分号. 接口声明 ...
- Python入门笔记(20):Python函数(3):关于lambda
一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的.如下: """命名的foo函数&q ...
- 你可以做一个更好的Coder为了自己的将来
小小的星辰 工作已经一年多了,时间真的好快啊!发现自己还是终于走出了当初的阴影!我可以快乐的做我自己了.这两年发现自己改变了很多!很庆幸,我可以不想你了!伤感的心情总会过去的.还记得曾经说过一句:“离 ...