swift 2.0 defer关键词

参考链接: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{
    // 处理异常
  }
}

 

 
 
 
posted @ 2016-08-08 13:31  紫洁  阅读(242)  评论(0编辑  收藏  举报