Swift3逃逸闭包报错:非逃逸参数completion可能逃逸问题求助
解决逃逸闭包的编译器报错问题
我来帮你拆解下问题的核心原因:
你当前的AnimationTemplate中,template属性的类型是((CompletionFunc) -> AnimationFunc)——虽然你在init里给整个template闭包加了@escaping修饰,但这个闭包的参数completion默认仍然是非逃逸(non-escaping)的。
而在你的使用场景里,你把这个completion传给了current.setState(to:with:)方法,这个方法大概率会将completion保存下来异步执行(也就是让它发生逃逸),但编译器不允许你将一个non-escaping的闭包传递给会让它逃逸的上下文,所以就抛出了那两处错误。
具体修复方案
只需要修改AnimationTemplate中template属性的定义,明确指定它的completion参数是逃逸类型即可:
final internal class AnimationTemplate { // 给CompletionFunc参数添加@escaping修饰,明确允许它逃逸 var template: ((@escaping CompletionFunc) -> AnimationFunc) init(template: @escaping ((@escaping CompletionFunc) -> AnimationFunc)) { self.template = template } func perform(with completion: CompletionFunc) { template(completion)() } } internal typealias CompletionFunc = ((Bool) -> Void) internal typealias AnimationFunc = (() -> Void)
修复逻辑说明
通过在template的参数定义里添加@escaping,我们相当于告诉编译器:这个completion闭包是允许被传递到逃逸上下文的,你可以安全地把它交给那些需要保存或异步执行它的方法(比如setState(to:with:))。
修改完成后,你原来的使用代码就不会再触发编译器报错了。
内容的提问来源于stack exchange,提问作者Muhammad Zohaib Ehsan
相关产品推荐
相关产品推荐

