我发现默认的 swift 闭包是非转义闭包,但没有找到任何解释为什么会这样。
谁能解释一下?
答案 0 :(得分:2)
转义闭包引入了额外的内存管理问题。您可以创建保留循环。 map
(采用非转义闭包)不担心保留循环,因此您不必在闭包中添加 self
以提醒调用者危险。 DispatchQueue.async
采用转义闭包,因此调用者需要对闭包的生命周期多加考虑,因此需要额外的语法来警告调用者。如果转义是默认设置,这将使本应简单的调用复杂化并减少优化机会。
答案 1 :(得分:1)
在 Swift 中,闭包默认是非转义的。这意味着闭包不能超过它作为参数传入的函数。如果您需要在将其传递给返回的函数之后保留该闭包,则需要使用关键字 @escaping
标记该闭包