在非转义函数中处理转义闭包
Handle escaping closure in non escaping function
在下面的代码中我得到了错误。
Passing non escaping parameter 'completion' to function expecting an
@escaping closure.
protocol DetailViewControllerDelegate: AnyObject {
func detailViewController(_ controller: DetailViewController, doneButtonPressed button: UIBarButtonItem)
}
final class DetailViewControllerDelegateHandler: DetailViewControllerDelegate {
typealias DismissComplete = () -> Void
typealias Action = (DismissComplete) -> Void
var dissmissScene: Action?
private let model = Model()
func detailViewController(_ controller: DetailViewController, doneButtonPressed button: UIBarButtonItem) {
dissmissScene? { [unowned self] in
let value = controller.value
self.model.update(with: value)
}
}
}
final class HomeViewController: UIViewController {
private let delegateHandler = DetailViewControllerDelegateHandler()
override func viewDidLoad() {
super.viewDidLoad()
delegateHandler.dissmissScene = { completion in
// error here
self.dismiss(animated: true, completion: completion)
}
}
func buttonAction(_ sender: UIButton) {
let controller = DetailViewController.instantiateFromStoryboard()
controller.delegate = delegateHandler
present(controller, sender: self)
}
}
我该怎么办?
completion
闭包没有转义。因为 dismissScene
是一个接受 non-escaping 闭包的函数。请注意,dismissScene
的类型是 Action
,即 (DismissComplete) -> Void
,而后者又是 (() -> Void) -> Void
。里面的() -> Void
没有标注@escaping
.
您只需将其标记为:
typealias Action = (@escaping DismissComplete) -> Void
在下面的代码中我得到了错误。
Passing non escaping parameter 'completion' to function expecting an @escaping closure.
protocol DetailViewControllerDelegate: AnyObject {
func detailViewController(_ controller: DetailViewController, doneButtonPressed button: UIBarButtonItem)
}
final class DetailViewControllerDelegateHandler: DetailViewControllerDelegate {
typealias DismissComplete = () -> Void
typealias Action = (DismissComplete) -> Void
var dissmissScene: Action?
private let model = Model()
func detailViewController(_ controller: DetailViewController, doneButtonPressed button: UIBarButtonItem) {
dissmissScene? { [unowned self] in
let value = controller.value
self.model.update(with: value)
}
}
}
final class HomeViewController: UIViewController {
private let delegateHandler = DetailViewControllerDelegateHandler()
override func viewDidLoad() {
super.viewDidLoad()
delegateHandler.dissmissScene = { completion in
// error here
self.dismiss(animated: true, completion: completion)
}
}
func buttonAction(_ sender: UIButton) {
let controller = DetailViewController.instantiateFromStoryboard()
controller.delegate = delegateHandler
present(controller, sender: self)
}
}
我该怎么办?
completion
闭包没有转义。因为 dismissScene
是一个接受 non-escaping 闭包的函数。请注意,dismissScene
的类型是 Action
,即 (DismissComplete) -> Void
,而后者又是 (() -> Void) -> Void
。里面的() -> Void
没有标注@escaping
.
您只需将其标记为:
typealias Action = (@escaping DismissComplete) -> Void