[swift 进阶]读书笔记-第八章:错误处理 C8P6 defer语法可以让代码更简洁 Clearing Up Using...

本文介绍了defer语法在代码清理中的应用,通过示例讲解了如何利用defer确保资源正确释放,特别是在文件读写和数据库操作中。此外,还展示了标准库中递归迭代器使用defer的巧妙之处。

错误处理 Error Handling

8.6 defer语法可以让代码更简洁 Clearing Up Using defer

本小节内容比较简单,主要延续之前的文件的有效性查询的Demo来引出defer语法,并介绍一些相关特性

引出defer关键字: 一般在可能抛出异常的方法都会使用 try/finally结构。无论最后是否有抛出异常都会走finally流程。 这个时候我们就可以使用defer语法让代码变得更灵活
defer关键字的作用:实际是一个闭包,在当前声明的作用域结束时执行
defer在文件读写中的使用.

func contents(ofFile ?lename: String) throws -> String {
	 let file = open("test.txt", O_RDONLY)
	 defer { close(file) }
	 let contents = try process(file: file) 
	 return contents 
}
复制代码
注1:在上面的demo中,如果不用defer关键字 当出现异常,直接就try 提前结束了. 导致当前的文件流没有执行close方法。这个在以后的数据库操作中可算是一个重大bug
注2: defer要写在reture 前面。 虽然它的执行上在return后。 你写在return后面,代码编译 return后的代码看都不看。这个时候你写defer实际上没啥用。
标准库中对defer的使用
下面会写出```Enumeratedlterator```协议中```next()```方法的代码实现。
##### 使用场景:增加计数器的值而且需要返回没有增加值之前的值。

	struct EnumeratedIterator<Base: IteratorProtocol>: IteratorProtocol, Sequence { 
		internal var _base: Base 
		internal var _count: Int ...
		func next() -> Element? { 
			guard let b = _base.next() else { return nil } 
			defer { _count += 1 } 
			return (offset: _count, element: b) 
		} 
	}
复制代码

多defer方法多使用注意

写一个操作数据库的Demo来讲讲
	guard let database = openDatabase(...) else { return } 
	defer { closeDatabase(database) } 
	guard let connection = openConnection(database) else { return } 
	defer { closeConnection(connection) } 
	guard let result = runQuery(connection, ...) else { return }
复制代码
类似于压栈操作,前面的后执行,后面的先执行。
上面的demo中的顺序也是在执行完数据库查询之后先```关闭链接```,再去```关闭数据库```。
复制代码

over~

文章源文件地址,大家如果有更好的想法和观点欢迎交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值