zoukankan      html  css  js  c++  java
  • Swift

    在一些语言中,有try/finally这样的控制语句,比如Java。

    这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪。

    在Swift 2.0中,Apple提供了defer关键字,让我们可以实现同样的效果。

    func checkSomething() {
        
        print("CheckPoint 1")
        doSomething()
        print("CheckPoint 4")
        
    }
    
    func doSomething() {
        
        print("CheckPoint 2")
        defer {
            print("Clean up here")
        }
        print("CheckPoint 3")
        
    }
    
    checkSomething() // CheckPoint 1, CheckPoint 2, CheckPoint 3, Clean up here, CheckPoint 4
    

    上述示例可以看到,在打印出“CheckPoint 2”之后并没有打印出“Clean up here”,而是“CheckPoint 3”,这就是defer的作用,它对进行了print("Clean up here")延迟。我们再来看一个I/O的示例:

    // 伪代码
    func writeSomething() {
        
        let file = OpenFile()
        
        let ioStatus = fetchIOStatus()
        guard ioStatus != "error" else {
            return
        }
        file.write()
        
        closeFile(file)
        
    }
    

    上述示例是一个I/O操作的伪代码,如果获取到的ioStatus正常,那么该方法没有问题,

    如果ioStatus取到的是error,那么会被guard语句抓到执行return操作,

    这样的话closeFile(file)就永远都不会执行了,一个严重的Bug就这样产生了。下面我们看看如何用defer来解决这个问题:

    // 伪代码
    func writeSomething() {
        
        let file = OpenFile()
        defer {
            closeFile(file)
        }
        
        let ioStatus = fetchIOStatus()
        guard ioStatus != "error" else {
            return
        }
        file.write()
        
    }
    

    我们将closeFile(file)放在defer代码块里,这样即使ioStatuserror,在执行return前会先执行defer里的代码,这样就保证了不管发生什么,最后都会将文件关闭。

    需要注意的是, 虽然说defer的内容会在return之前执行, 但是如果defer定义在return之后, 那么还是不会执行defter的内容, 也就是说, defer关键字必须比return早出现。

    放在return之后:

    var str = "Hello, playground"
    
    func show() {
        print("这里是即将要推迟(但一定会)执行的代码")
    }
    
    func test() {
        
        if str.characters.count >= 2 {
            print("跳出该方法的执行")
            return
        }
        
        defer {
            show()
        }
    }
    
    test()  // 输出结果: 跳出该方法的执行
    

    放在return之前:

    var str = "Hello, playground"
    
    func show() {
        print("这里是即将要推迟(但一定会)执行的代码")
    }
    
    func test() {
        
        defer {
            show()
        }
        
        if str.characters.count >= 2 {
            print("跳出该方法的执行")
            return
        }
    }
    
    test()  // 输出结果: 跳出该方法的执行 这里是即将要推迟(但一定会)执行的代码
  • 相关阅读:
    IBM项目(项目管理)
    MSN附加照片问题解决
    国家图书馆新馆
    『Python Kivy』Kivy and PyDev on Eclipse
    『C#基础』C#导出Excel
    『Python Kivy』什么是Kivy,以及Hello world
    『创建型』简单工厂SimpleFactory、工厂方法FactoryMethod、抽象工厂AbstractFactory
    『C#基础』多线程笔记「三」计时器
    『C#基础』多线程笔记「二」线程同步
    『创建型』单例模式Singleton学习笔记
  • 原文地址:https://www.cnblogs.com/Rinpe/p/5221783.html
Copyright © 2011-2022 走看看