04-Swift之Defer

Swift2.0中加入了defer新语法声明。

defer译为延缓、推迟之意。

那么在Swift2.0中它将被应用于什么位置呢?

比如,读取某目录下的文件内容并处理数据,你需要首先定位到文件目录,打开文件夹,读取文件内容以及处理数据,关闭文件以及文件夹。倘若一切顺利,只需按照设定好的程序流程走一轮即可;不过考虑事情要面面俱到,倘若中间某个环节失败,比如读取文件内容失败、处理数据失败等等,还需要进行一些后续收尾工作,即关闭文件或关闭文件夹(当然就算顺利执行,也是要关闭的)。

先谈谈defer的基础语法,声明方式如下:

defer{// 做一些事情}

可以看到声明方式非常简单,defer关键字打头,紧跟{}程序块,大括号中添加延迟处理代码。平常应用方式如下:

funcdoSomethingWithDefer(){
	// 1
	openDirectory()
	// 2
	defer{ closeDirectory() }
	// 3
	openFile()
	// 4
	defer{ closeFile() }
	// 做其他杂七杂八事情...
}

分析代码:

定位到目录并打开指定文件夹,倘若打开文件夹失败则结束函数。

主要到defer的用法这条语句并不会马上执行,而是被推入栈中直到函数结束时才再次被调用

  • 打开文件,倘若失败则结束函数。

  • defer内容关闭文件,这条语句一样不会被马上执行,而是推入栈中,此时它位于defer{closeDirectory()}语句的上方,直到函数结束时才再次被调用。

  • 倘若一切都顺利,函数运行到最后了,开始从栈中依次弹出方才推入的defer语句,首先是closeFile(),其次是closeDirectory()。确实当我们处理完文件,需要先关闭文件,再关闭文件夹。

最后必须说下defer的作用域,这点灰常重要

注意作用域,其次是调用顺序——即一个作用域结束,该作用域中的defer语句自下而上调用。

funclookforSomething(name:String)throws{
//这里是作用域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")    } 
	}
}//有兴趣的看看依次输出什么//try! lookforSomething("")//调出 debug Area 快捷键 shift+ command + ytry! lookforSomething("hello")

其实先前有个地方说的不准确,并不是函数结束时开始执行defer栈推出操作而是每当一个作用域结束就进行该作用域defer执行

作者:飘金
链接:https://www.jianshu.com/p/20c4ec2b224c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值