【WIP】Swift4 异常处理, JSON处理
创建: 2018/03/24
更新: 2018/06/05 补充catch可以只带where不带模式
【任务表】TODO
异常处理语法 | |||||||||||||||||||||
异常的发生 |
抛出例外 thorw 式 ● 抛出的值的类型必须采用Error协议, 定义可抛出函数时不用声明抛出值类型(同一个函数内也可以抛出不同类型的) 是空协议 public protocol Error { } extension Error { } 抛出值的类型的例 enum SampleError1: Error { // 抛出值类型的例 case asSimpleResultA, asSimpleResultB case asString(String) case asNumer(Int) }
● 声明可能抛出异常的函数, 在参数表(...)后面加上throws // throws 记在参数表 [()] 后面, 返回值 [ -> 类型] 前面 func sample() thorws // 不带参数和返回值 func sample(a: Int, b: Int) throws // 不带返回值 func sample(mode: Mode) throws -> Bool // 带参数和返回值
● 声明可能抛出异常的构造函数 init(...) throws // 和函数一样, 只不过构造函数不写返回值
|
||||||||||||||||||||
异常的传播与捕捉 |
遇到抛出异常, 一层层往上抛, 直到遇到可以catch自己的catch ● 呼出可抛出异常的函数的, 如果能catch所有可能的异常就是普通函数 如果不能catch, 则自身也是可抛出异常的函数. 要带throws
|
||||||||||||||||||||
呼出会抛出异常的函数的方法 |
呼出会抛出异常的都必须带try try 可抛出异常的函数
没有异常则和平常一样, 抛出异常则往上一次抛. 这么呼出的, 自身也是抛出异常的函数 ● do-catch do { ... try 可抛出异常的函数 ... } catch { ... } catch所有可能的错误的话, 自身是普通函数。否则为会抛出异常的函数 ● try? 没有异常返回正常返回值, 异常返回nil 少用, 不好确定错误 ● try! 相当于作为不会抛出异常的函数来呼出 发生异常程序停止, 尽量不用 |
||||||||||||||||||||
do-catch |
do { ... try ... # 呼出会抛出异常的函数/构造函数 ... } catch pattern where ... { // pattern和where都可以省略, 可以只有pattern或者where ... } catch ... { // catch可以有多个 ... } catch { // 最后一个接上面都不匹配的 ... } ● 不带默认( catch {...} ) 的则不匹配往外throw错误 不带默认的catch内部用error来获取错误 |
||||||||||||||||||||
try?与try! |
● try? 没抛出错误则和普通函数一样, 发出错误则为nil. 返回型为T的, 用try则返回T? 用法: if let result = try? getReslt(mode: Mode.sample) { # if-let ... } ● try! 没抛出错误和普通函数一样, 抛出错误则程序报错并停止运行
|
||||||||||||||||||||
会抛出错误的可选型函数与try? | 返回值为T??型 | ||||||||||||||||||||
终止处理与收尾处理 | |||||||||||||||||||||
访问控制 | |||||||||||||||||||||
断言(assertion)与测试 | |||||||||||||||||||||
可利用条件与预处理控制 | |||||||||||||||||||||
实例的序列化 | |||||||||||||||||||||
概念 |
把数据转为比特列 serialize / encode(特指内容方面) / archive(存入文件为目的) 比特列转为数据: deserialize / decode / unarchive |
||||||||||||||||||||
协议 |
|
||||||||||||||||||||