• 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{
        // 处理异常
      }
    }

     
     
     
  • 相关阅读:
    浅谈均值、方差、标准差、协方差的概念及意义
    数据库设计的基本步骤
    VS添加lib库
    Android activity_main.xml删除边缘距离,充满屏幕
    Android 设置旋转朝向
    WebStorm注册码
    VS禁止特定警告
    VS 高亮显示不带后缀的C++头文件
    VS2010设置C++包含目录和库目录
    读取STL模型
  • 原文地址:https://www.cnblogs.com/muzijie/p/5748966.html
Copyright © 2020-2023  润新知