本篇分两部分:

  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. [Design Patterns] 2. Design principle

    Single Responsibility Principle 类的设计趋向于:Use Case Diagram --> (derived) --> Detail Open-Closed ...

  2. Hadoop第4周练习—HDFS读写文件操作

    1    运行环境说明... 3 :编译并运行<权威指南>中的例3.2. 3 内容... 3 2.3.1   创建代码目录... 4 2.3.2   建立例子文件上传到hdfs中... 4 ...

  3. Deep Learning 在中文分词和词性标注任务中的应用

    开源软件包 SENNA 和 word2vec 中都用到了词向量(distributed word representation),当时我就在想,对于我们的中文,是不是也类似地有字向量(distribu ...

  4. django 快速实现登录

    前言 对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说不具有很强的操作性:对于web ...

  5. Linux用户组管理

    用户组信息存放:/etc/group 当组内只有一个用户,并且用户名和用户组名一致时默认不显示:组号1-499是系统预留的用户组,>=500的用户组是管理员手动创建的,组密码占位符用x表示   ...

  6. [python]抽象方法

    抽象方法 我的理解抽象方法就是:父类的一个方法,继承的所有子类都必须要实现这个方法,否则报错. 举例说明 class Base(object): def _method(self): raise No ...

  7. html5中的大纲

    html5中的大纲 前言: 在html5中我们可以使用结构元素来编排一份大纲,这样我们就可以通过这个网页的大纲来了解网页中有哪些内容,网页中以什么样的形式来组织这些内容有更清楚的认识. 1.html5 ...

  8. js-DOM控制HTML

    一. dom对象控制html    HTML DOM 是 W3C 标准(是 HTML 文档对象模型的英文缩写,Document Object Model for HTML).    HTML DOM ...

  9. 基于HTML5的燃气3D培训仿真系统

    最近上线了的基于HTML5的燃气3D培训仿真系统,以前的老系统是采用基于C++和OpenGL的OpenSceneGraph引擎设计的,OSG引擎性能和渲染效果各方面还是不错的,但因为这次新产品需求要求 ...

  10. Velocity魔法堂系列二:VTL语法详解

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...