【问题标题】:Handle escaping closure in non escaping function在非转义函数中处理转义闭包
【发布时间】:2020-08-09 07:06:58
【问题描述】:

在下面的代码中我得到了错误。

将非转义参数“完成”传递给期望 @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)
    }
}

对此我能做些什么?

【问题讨论】:

    标签: swift memory-management closures


    【解决方案1】:

    completion 闭包没有转义。因为dismissScene 是一个接受非转义闭包的函数。请注意dismissScene 的类型是Action,即(DismissComplete) -> Void,而后者又是(() -> Void) -> Void。内部() -> Void 未标记@escaping

    您只需将其标记为:

    typealias Action = (@escaping DismissComplete) -> Void
    

    【讨论】:

    • 啊,我不知道你可以将它标记为这样的转义。谢谢。
    猜你喜欢
    • 2021-12-23
    • 2020-05-04
    • 1970-01-01
    • 2021-12-20
    • 2016-12-23
    • 1970-01-01
    • 2018-06-10
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多