笔记摘要(十二)--Swift3.0之错误处理and类型转换

错误处理

  • 表示并抛出错误

    • 在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中使用isas操作符实现。也可以用来检查一个类型是否实现了某个协议。

  • 检查类型

    用类型检查符is来检查一个实例是否属于特定子类型。若实例属于那个子类型,返回true,否则返回false。

  • 向下转型

    当类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,可以尝试向下转到它的子类型,用类型转换操作符as?as!

    转换没有真的改变实例或它的值。根本的实例保持不变:只是简单的把它作为它被转换成的类型来使用。

  • Any和AnyObject的类型转换

在你的代码里使用你期望的明确类型总是更好的。

AnyObject可以表示任何类类型的实例。
Any可以表示任何类型,包括函数类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容