美文网首页swift
Swift逃逸闭包和非逃逸闭包

Swift逃逸闭包和非逃逸闭包

作者: J扣歪 | 来源:发表于2020-11-27 14:46 被阅读0次

根据闭包调用时的时机划分为逃逸闭包和非逃逸闭包。

一、非逃逸闭包

不需要其它特殊时机,只能在函数作用域内函数执行结束前被调用

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.test {
            print("非逃逸")
        }
    }
    
    func test(callback:()->()) {
        print("1")
        callback()
        print("2")
    }
    
}

给函数test传递一个闭包参数callback,此时闭包callback调用只能在函数作执行结束前被当做函数内的任务依次被执行,这种情况下的闭包就是非逃逸闭包。

二、逃逸闭包

不需要在函数结束前被调用,可以等到特定时机时才被调用

class ViewController: UIViewController {

    var escapingCallback : (()->())?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.test {
            print("逃逸")
        }
        
        escapingCallback?()
    }
    
    func test(callback:@escaping ()->()) {
        escapingCallback = callback
    }
   
}

给当前类声明一个闭包变量escapingCallback,将test函数内的闭包参数赋值给这个变量,此时这个闭包就可以在函数执行结束后或其他时候被调用。

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.test {
            print("逃逸")
        }
    }
    
    func test(callback:@escaping()->()) {
        print("1")
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            callback()
        }
        print("2")
    }
    
}

不需要在test函数结束前调用,等到1秒后再调用闭包callback。

逃逸闭包类型需要用@escaping标记

相关文章

网友评论

    本文标题:Swift逃逸闭包和非逃逸闭包

    本文链接:https://www.haomeiwen.com/subject/wxexwktx.html