swift Defer语法

文章转载自:

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判断语句,进入作用域2defer {print("2-2")}是等作用域2执行完成之后再执行,所以作用域2的输出顺序是2-12-32-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-61-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")

        }

    }



你可能感兴趣的:(Swift)