defer说是关键字并不合适,应该说是defer语句,应为使用的时候,一般都是如下

defer {
   ...
}

defer语句:用来定义以任何方式(抛错误,return等)离开代码块前必须要执行的代码

defer语句是一个神奇语句:

它的核心功能就是:将括号里的代码延迟至当前作用域结束之前执行

需求如下,divide(num1: 20, num2: 0)函数可能抛出异常,那么print(2)是不会执行的,如果想要print(2)一定执行,那么需要defer语句,放在可能抛异常的代码前面

func processFile() throws {
    print(1)
    
//    defer {
//        print(2)
//    }

    // 可能会抛出异常
    try divide(num1: 20, num2: 0)
    // 注意:如果程序终止了,那么defer也不会执行
    print(2)
}

注意点: 多个defer语句,它的执行顺序

func processFile() throws {
    print(1)
    defer {
        print(2)
    }
    defer {
        print(3)
    }
    try divide(num1: 20, num2: 0)
}
 
// 打印顺序1 3 2

有点像数据结构中的栈,先进后出

总结: defer语句使用场景,一般是在可能抛出异常的函数后,又必须要执行的代码