文章转载自:
http://www.jianshu.com/p/eb718439551f
//defer 语句
/*
延缓推迟,相当于把操作放入栈中,后加入的先执行
*/
/*
分析代码:
定位到目录并打开指定文件夹,倘若打开文件夹失败则结束函数。
主要到defer的用法,这条语句并不会马上执行,而是被推入栈中,直到函数结束时才再次被调用。
打开文件,倘若失败则结束函数。
defer内容关闭文件,这条语句一样不会被马上执行,而是推入栈中,此时它位于defer{closeDirectory()}语句的上方,直到函数结束时才再次被调用。
倘若一切都顺利,函数运行到最后了,开始从栈中依次弹出方才推入的defer语句,首先是closeFile(),其次是closeDirectory()。确实当我们处理完文件,需要先关闭文件,再关闭文件夹。如果文件打开失败,则直接执行关闭文件夹
*/
func doSthWithDefer() {
//
openDirectory()
defer {closeDirectory() }
openFile()
defer { closeFile() }
}
//打开目录
func openDirectory() {}
//关闭目录
func closeDirectory() {}
//打开文件
func openFile() {}
//关闭文件
func closeFile() {}
关于defer的作用域
/*
并不是函数结束时开始执行defer栈推出操作,而是每当一个作用域结束就进行该作用域defer执行
函数分析:
当参数name==""时,先执行print("1-1"),之后进入if判断语句,进入作用域2,defer {print("2-2")}是等作用域2执行完成之后再执行,所以作用域2的输出顺序是2-1、2-3、2-2
接着执行print("1-2"),输出1-2
defer {print("1-3")},把print("1-3")操作加入作用域1的栈中,执行print("1-4"),输出1-4,执行print("1-5"),输出1-5
defer {print("1-6")},把print("1-6")操作加入作用域1的栈中
作用域1完成,执行栈中的defer操作,后进先出的执行顺序,输出1-6、1-3
*/
func lookforSth(name:String) {
//作用域1整个函数是作用域
print("1-1")
if name == "" {
//作用域2 if作用域
print("2-1")
defer {
print("2-2")
}
print("2-3")
}
print("1-2")
defer {
print("1-3")
}
print("1-4")
if name == "hello" {
//作用域3
print("3-1")
defer {
print("3-2")
}
print("3-3")
defer {
print("3-4")
}
}
print("1-5")
defer {
print("1-6")
}
}