swift - 在非转义函数中处理转义闭包
问题描述
在下面的代码中,我得到了错误。
将非转义参数“完成”传递给期望 @escaping 闭包的函数。
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
是一个接受非转义闭包的函数。请注意 的类型dismissScene
是Action
,即(DismissComplete) -> Void
,而后者又是(() -> Void) -> Void
。内部() -> Void
没有标记@escaping
。
您只需将其标记为:
typealias Action = (@escaping DismissComplete) -> Void
推荐阅读
- ajax - 使用 Nginx 部署 Django 应用程序后,AJAX POST 请求上的 CSRF 失败
- linux - 为什么 pie 二进制文件中不允许使用“symbol@GOT”?
- jsf - 在 p:schedule 中查找所选期间的开始和结束日期
- html - 使用 RESPONSIVE 空格填充在固定导航栏下移动内容
- javascript - Tokbox streamCreated 被调用的客户端被调用的次数相同
- kubernetes - 未设置 Kubernetes 上下文
- android - 链式请求 Kotlin 协程
- php - 过滤网站上的虚假流量
- python - 绘制笛卡尔坐标轴
- php - laravel 重定向到页面的某些部分