本小节内容比较简单,主要延续之前的文件的有效性查询的Demo来引出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
}
下面会写出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很有趣的Swift面试题, 是Objc.io 里面很有名的一道题。
var counter = 5
func increment() -> Int {
defer { counter += 1 }
return counter
}
counter = increment()
// What's the value of counter?
可能大部分童鞋都能把答案猜对,但其中具体的原因可能还真不是你想的那样哈哈~ 具体的思路见网页: https://www.objc.io/quiz/19/
写一个操作数据库的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~