Swift - defer 关键字

defer常用于数据库操作中的打开关闭或我们要执行某些必要操作流程时候
defer会在该当前声明的作用域结束时候执行
优先级,局部优先、同级自下而上
func firstProcesses(_ isOpen: Bool) {
    
    //作用域1 整个函数作用域
    defer{
        print("推迟操作🐢")
    }
    
    print("😳")
    
    if isOpen == true {
        //作用域2 if的作用域
        defer{
            print("推迟操作🐌")
        }
        print("😁")
    }
}

firstProcesses(false)
/*
 
 😳
推迟操作🐢
 
 */
 

firstProcesses(true)
/*
 
 😳
 😁
 推迟操作🐌
 推迟操作🐢
 
 */
guard 和 defer 使用
func secondProcesses(_ isOpen: Bool) {
    
    defer {
        print("推迟操作🐢")
    }

    guard isOpen == true else {
        print("跳出该方法的执行😳")
        return
    }
}

secondProcesses(false) //跳出该方法的执行😳 -> 推迟操作🐢
secondProcesses(true) //推迟操作🐢

/// defer 在 guard 语句的前后区别

func secondProcesses2(_ isOpen: Bool) {
    
    guard isOpen == true else {
        print("跳出该方法的执行😳")
        return
    }

    defer {
        print("推迟操作🐢")
    }
}

secondProcesses2(false) //跳出该方法的执行😳
secondProcesses2(true) //推迟操作🐢
defer 使用
比如我们进行tableView 插入或者删除Cell 带动画操作时候

常规写法:

func updateTableView() {
    
    tableView.beginUpdates()
    
    tableView.insertRows...
    tableView.deleteRows...
    
    tableView.endUpdates()
}

defer写法:

func updateTableView() {
    
    tableView.beginUpdates()
    defer {
        tableView.endUpdates()
    }
    
    tableView.insertRows...
    tableView.deleteRows...
}

扩展优化:

extension UITableView {
    func updateCells(updateBlock: (UITableView) -> Void) {
        beginUpdates()
        defer {
            endUpdates()
        }
        updateBlock(self)
    }
}

func updateTableView() {

    tableView.updateCells { (tableView) in
        tableView.insertRows(at: [IndexPath(row: 2, section: 0)], with: .fade)
        tableView.deleteRows(at: [IndexPath(row: 5, section: 0)], with: .fade)
    }
}

参考来源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容