参考链接:http://www.jianshu.com/p/eb718439551f
1 defer语法
defer是Swift2.0中加入的新语法声明。defer译为延缓、推迟之意。
defer的语法如下:
defer { //do something }
{}中添加延迟处理的代码。
当代码执行到defer语句时,它并不会立刻执行,而是放入defer栈中,当一个作用域结束后,该作用域中的语句会自上而下的调用栈中的语句。
2 代码示例
func lookforSomething(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("")
输出结果为:
1-1
2-1
2-3
2-2
1-2
1-4
1-3
try! lookforSomething("hello")
输出结果为:
1-1
1-2
1-4
3-1
3-3
3-4
3-2
1-3
3 应用
(1)应用一
public class MyNewType : NSObject { public var myOptionalField:Float? { willSet { if let newValue = newValue { print("I'm going to change to (newValue)") } } didSet { if let myOptionalField = self.myOptionalField { print("Now I'm (myOptionalField)") } } } override public init() { super.init() // Non-defered self.myOptionalField = 6.28 // Defered defer { self.myOptionalField = 3.14 } } }
输出结果为:
I'm going to change to 3.14 Now I'm 3.14
(2)应用二:do中处理逻辑,如果有异常,其余代码不会执行,直接跳到catch中。则有可能会导致文件没有关闭。为了防止这种情况,在打开文件的代码后,直接写关闭文件,而关闭文件是放在defer关键字中中。这样当searchInFile整个函数中代码都执行完成后(包括正常执行结束的代码以及抛出异常的代码),肯定会执行defer中代码的。
func searchInFile() {
// 打开文件代码
defer{
// 关闭文件
}
do{
// 逻辑处理,有可能会抛出异常,抛出异常后,其余代码不会执行,而是直接跳到catch代码中
}
catch{
// 处理异常
}
}