【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

 协议

 

序列化 Encodable

 必须方法

 

 func encode(to: Encoder) throws

 ● 参数需要采用了Encoder协议

   

 

 解序列化 Decodable

 必须方法

 

 

 init(from: Decoder) throws

 ● 参数需要采用了Decoder协议

   

 

   
 Codable

 typealias Codable = Decodalbe & Encodable

 ● Swift的基本数据类型(Int, String等)都采用了Codable

 ● 基本数据类型为元素的数组,哈希表,集合等也采用了Codable

 ●构造体的所有容纳型属性都采用Codable的话, 此构造体也可以直接采用Codable 

struct Samle: Codable {
    var sample: [Int] {
        return [0]
    }
}

 

 

   
   

  

   
   
   
   
   
   
   
   
posted @ 2018-03-24 12:09  懒虫哥哥  阅读(154)  评论(0编辑  收藏  举报