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")
网友评论