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()  // 输出结果: 跳出该方法的执行 这里是即将要推迟(但一定会)执行的代码
  • 相关阅读:
    JVM深入理解(四)-内存模型【上】
    JVM深入理解(三)-加载与字节码执行
    JVM深入理解(二)-结构与内存管理
    初级正则表达式
    光弧,高亮
    substr,subString,split,slice,replace的区别
    SpringBoot配置SSLUnable to start ServletWebServerApplicationContext due to multiple ServletWebServerFa
    79:Python开发-sqlmapapi&Tamper&Pocsuite
    76:Python开发-内外网收集Socket&子域名&DNS
    77:Python开发-批量Fofa&POC验证&SRC提取
  • 原文地址:https://www.cnblogs.com/Rinpe/p/5221783.html
Copyright © 2011-2022 走看看