错误处理
-
表示并抛出错误
在Swift中,错误用符合
Error协议
的类型的值来表示;这个空协议表明该类型可以用于错误处理。Swift的枚举类型尤为适合构建一组相关的错误状态,枚举的关联值还可以提供错误状态的额外信息。
-
抛出错误使用
throw
关键字。enum VendingMachineError: Error{ case InvalidSelection case InsufficientFunds(coinsNeeded: Int) case OutOfStock } throwVendingMachineError.InsufficientFunds(coinsNeeded: 5)
-
处理错误
- 用
throwing 函数
传递错误
- 用
为了表示一个函数、方法或构造器可以抛出错误,在函数声明的参数列表之后加上throws
关键字。一个标有throws关键字的函数被称作throwing函数。如果这个函数指明了返回值类型,throws关键词需要写在箭头(->)的前面。
一个throwing函数可以在其内部抛出错误,并将错误传递到函数被调用时的作用域。
任何在某个非throwing函数内部抛出的错误只能在函数内部处理。
-
用do-catch处理错误
可以使用一个do-catch语句运行一段闭包代码来处理错误。如果在do子句中的代码抛出了一个错误,这个错误会与catch子句做匹配,从而决定哪条子句能处理它。
将错误转换成可选值
可以使用try?
通过将错误转换成一个可选值来处理错误。如果在评估try?表示式时一个错误被抛出,那么表达式的值就是nil。
禁用错误传递
当某个throwing函数实际上在运行时是不会抛出错误时,可以在表达式前面写try!
来禁用错误传递。这会把调用包装在一个不会有错误抛出的运行时断言中。如果真的抛出了错误,你会得到一个运行时错误。-
指定清理操作
可以使用
defer语句
在即将离开当前代码块时执行一系列语句。比如,可以用来确保文件描述符得以关闭,以及手动分配的内存得以释放。defer语句将代码的执行延迟到当前的作用域退出之前。
即使没有涉及到错误处理,你也可以使用defer语句。
类型转换
类型转换在swift中使用
is
和as
操作符实现。也可以用来检查一个类型是否实现了某个协议。
-
检查类型
用类型检查符
is
来检查一个实例是否属于特定子类型。若实例属于那个子类型,返回true,否则返回false。 -
向下转型
当类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,可以尝试向下转到它的子类型,用类型转换操作符
as?
或as!
。转换没有真的改变实例或它的值。根本的实例保持不变:只是简单的把它作为它被转换成的类型来使用。
Any和AnyObject的类型转换
在你的代码里使用你期望的明确类型总是更好的。
AnyObject
可以表示任何类类型的实例。
Any
可以表示任何类型,包括函数类型。