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)
}
}