本篇分两部分:

  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开发第一篇——异常处理及断言的更多相关文章

  1. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  2. iOS开发——高级技术精选&底层开发之越狱开发第一篇

    底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...

  3. Android百度地图开发-第一篇:申请、搭建百度地图

    一.前言 这是第一篇关于Android使用百度地图的学习记录,主要记录: 1.在百度地图开发者平台上申请API Key. 2.在自己的应用中加入百度地图的Android版SDK. 3.在自己的应用中显 ...

  4. swift开发网络篇—NSURLConnection基本使用

    iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...

  5. Swift开发第二篇——extension及fatalError

    本篇分两部分: 一.extension在 Swift 中的使用 二.Swift 中的 fatalError 一.extension在 Swift 中的使用 在 swift 中我们可以通过 extens ...

  6. android 串口开发第一篇:搭建ndk开发环境以及第一个jni调用程序

    一:ndk环境搭建 1:开发环境 我使用的是android studio 2.3.3版本,搭建ndk开发环境比较简单,打开File----Settings----Appearance&Beha ...

  7. python开发第一篇:初识python

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  8. Swift开发第九篇——Any和AnyObject&typealias和泛型接口

    本篇分为两部分: 一.Swift中的Any和AnyObject 二.Swift中的typealias和泛型接口 一.Swift中的Any和AnyObject 在 Swift 中,AnyObject 可 ...

  9. PowerBI开发 第一篇:设计PowerBI报表

    PowerBI是微软新一代的交互式报表工具,把相关的静态数据转换为酷炫的可视化的,能够根据filter条件,对数据执行动态筛选,从不同的角度和粒度上分析数据.PowerBI主要由两部分组成:Power ...

随机推荐

  1. MyBatis知多少(17)MyBatis和JDBC

    有了MyBatis,就不再需要编写JDBC代码了.像JDBCT这样的API的确非常强大,但使用起来总不免觉得太过繁琐.代码清单给出了一个使用JDBC的示例. 从这个例子中很容易看出,JDBC API会 ...

  2. linux 硬盘分区,分区,删除分区,格式化,挂载,卸载笔记

    linux 虽然一直都有在玩,但是对硬盘操作确实不是很熟悉今天有空,就整理了下. 1, 创建分区 先查看下是否有磁盘没有分区 fdisk -l 其中第一个框和第二个框,是已经分好区的磁盘,第三个硬盘没 ...

  3. 修复AWS上EC2损坏的sshd_config文件

    常识: AWS是没有root用户的,登陆也都是通过SSH KEY完成授权认证. 背景: 正在AWS上搭一个CI (GO),与gitlab,为了将其进行集成,需将gitlab的deploy key设置成 ...

  4. Python单元测试框架之pytest -- fixtures

    fixtures不太好翻译,可看作是夹心饼干最外层的两片饼干.通常用setup/teardown来表示.它主要用来包裹测试用例,为什么需要这样的饼干呢?我们以web自动化测试为例,例如,要测试的某系统 ...

  5. Feathers JS – 基于 Express 构建数据驱动的服务

    Feathers 是一个轻量的 Web 应用程序框架,基于 NodeJS 最流行​​的 Web 框架——Express.这使得它很容易使用 socket.io 来创建 RESTful Web 服务和实 ...

  6. LitePal + Gson + Volley的ORM框架尝试方案

    为了紧跟技术潮流,目前的项目开始采用ORM的思想进行重新设计. 数据库采用轻量级ORM框架LitePal,Json解析采用Gson,网络框架采用Volley. 如果只是单纯的将这些第三方框架引进来,事 ...

  7. DFS --- HNU 13307 Galaxy collision

    Galaxy collision Problem's Link Mean: 给定二维坐标平面内的n个整数点,让你把这n个点划分为两个集合,同一集合内的所有点必须两两距离大于5,求这两个集合的元素个数之 ...

  8. 20161119微信小程序初识

    Tritonal ft. Angel Taylor - Getaway [Official Lyric Video]

  9. javaweb学习总结(三十二)——JDBC学习入门

    一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  10. oracle中文显示为问号

    在用PL/sql查询时,中文显示为问号.经查证,发现问题为oracle字符集不支持中文导致的.修改oracle字符集,改为支持中文即可. 方法: 第一步:修改注册表. 开始-运行-输入regedit- ...