逃离关闭swift3

时间:2018-01-04 10:14:12

标签: ios swift3 xcode8

我遇到关于转义转义的问题。闭包被定义为转义但不知何故编译器总是出错。

我得到的错误是

  

关闭使用非转义参数'完成'可能会让它逃脱

我还提到了我收到错误的地方。

以下是定义闭包的代码。

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

我已经看到很多关于此错误问题的其他问题,但似乎没有解决我的问题。任何帮助都将受到高度赞赏。谢谢

1 个答案:

答案 0 :(得分:0)

使闭包可选解决问题。这是最终的命中和试验。

 internal typealias CompletionFunc =  (( Bool) -> Void)?

我看到这个闭包被传递给一个接受一个可选闭包的函数。然后我决定让它成为可选的。当我把它作为可选时,错误就消失了。 xcode也许给了我一个错误的错误。