Swift错误处理和泛型

2018-11-17  本文已影响0人  chrisdev

1. 错误处理, 可以用任何遵循Error协议的类型来表示错误. 可以用throw来抛出一个错误, 并用throws来标记一个可以抛出错误的函数. 如果在函数里抛出错误, 函数会立即返回并调用函数的代码处理错误.

enum PrinterError: Error {    case outofPaper, noToner, onFire    }

func send(job: Int, toPrinter printerName: String) throws -> String {

        if pringterName = "Never Has Toner" {    throw PrinterError.noToner    }

        return "Job sent"

}

2. 处理错误的方法: do-catch, 在do代码块里, 用try来在能抛出错误的函数前标记, 在catch代码里, 错误会自动赋予名字error, 如果不给其他名字的话. 另一种方式是: 使用try?来转换结果为可选项, 如果返回错误, 错误将会被忽略并且结果为nil, 否则结果是函数返回值的可选项. defer是函数返回后也会被执行的代码块, 

do {

        let printerResponse = try?send(job: 1040, toPrinter: "Bi Sheng")

        print(printerResponse)

} catch {

        print(error)

}

3. 泛型, Swift是一种静态类型化语言, 编译器明确知道代码处理什么类型的信息, 这就意味着不能将字符串传送给打算处理日期的代码. OC是可以的, 但是这种严格性, 意味着失去灵活性, 这个时候泛型就出场了. 事实上数组就是一种泛型. 创建一个泛型类型, 通常像对象一样命名, 然后在尖括号之间指定任意泛型类型. 传统上使用术语T, 但完全可以按照自己的意愿使用任何术语.

class Tree<T> {

        var value: T                                    //T现在可以看做一种类型

        var children: [Tree <T>] = []        //任意数量的子tree对象

        init(value: Int) {    self.value = value    }

        func addChild(value: T) -> Tree <T> {

                let newChild = Tree<T>(value: value)

                children.append(newChild)

                return newChild

        }

}    //一旦定义了一个泛型类型, 就可以创建具体非泛型类型.

//创建Int版本

let IntegerTree = Tree<Int>(value: 5);    IntegerTree.addChild(5)

//Stirng版本

let stringTree = Tree<String>(value: "hello");    stringTree.addChild("world")

上一篇下一篇

猜你喜欢

热点阅读