首页 > 解决方案 > 如何将 inout 变量与其他来源定义的闭包一起使用?

问题描述

我对 Swift 比较陌生,想知道如何才能做到这一点。

我有一个 Swift 进程,我想在完成时切换一个标志,我有以下代码:

task.terminationHandler = { process in
    isTaskComplete.toggle()
}

我在各种视图中复制了这个确切的代码,并试图将其转换为函数,我第一次尝试isTaskComplete使用inout.

但是,因为terminationHandler它本身定义了它所采用的闭包的参数,所以我没有办法附加一个辅助inout参数。我想知道是否有任何方法可以让我引用闭包内的标志并引用该值?

对于使用 Swift 5 和 Xcode 11.5 的价值。

任何帮助将不胜感激!谢谢 :)

标签: swiftmacosfoundation

解决方案


你可以使用protocolsand protocol extensions

protocol NameYourProtocol {
    var task: TypeOfTask { get } // { get set } If you need
    var isTaskComplete: Bool { get } 
}

extension NameYourProtocol {

    func handleTermination() {
        task.terminationHandler = { process in
            isTaskComplete.toggle()
        }
    }
}

这就是你在需要调用它的每一堂课中要做的:

class Worker: NameYourProtocol {
    // This will be required by protocol.
    var task = TypeOfTask()
    var isTaskComplete = false

    init() {
        // Call `handleTermination` where you need to.
        handleTermination()
    }
}

推荐阅读