我遇到关于转义转义的问题。闭包被定义为转义但不知何故编译器总是出错。
我得到的错误是
关闭使用非转义参数'完成'可能会让它逃脱。
我还提到了我收到错误的地方。
以下是定义闭包的代码。
final internal class AnimationTemplate {
var template: ((CompletionFunc) -> AnimationFunc)
init(template: @escaping (CompletionFunc) -> AnimationFunc)
{
self.template = template
}
func perform(with completion: CompletionFunc) { template(completion)() }
}
internal typealias CompletionFunc = (( Bool) -> Void)
internal typealias AnimationFunc = (() -> Void)
现在在这里使用。
AnimationQueue.shared.enqueue(animation: AnimationTemplate { completion in
//Error here
//Closure use of non-escaping parameter 'completion' may allow it to escape
return {
(0 ..< self.placeholderViews.count).forEach {
let current: PasscodeSignPlaceholderView = self.placeholderViews[$0]
let state: PasscodeSignPlaceholderView.State = $0 < inputLength ? .active : .inactive
//Error here
//Closure use of non-escaping parameter 'completion' may allow it to escape
current.setState(to: state, with: completion)
}
}
})
我已经看到很多关于此错误问题的其他问题,但似乎没有解决我的问题。任何帮助都将受到高度赞赏。谢谢
答案 0 :(得分:0)
使闭包可选解决问题。这是最终的命中和试验。
internal typealias CompletionFunc = (( Bool) -> Void)?
我看到这个闭包被传递给一个接受一个可选闭包的函数。然后我决定让它成为可选的。当我把它作为可选时,错误就消失了。 xcode也许给了我一个错误的错误。