在闭包内部调用闭包

时间:2019-03-08 11:45:40

标签: swift closures

这是我的代码:

var work: ((Int, completionHandler: (() -> ()) -> ()))?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    work(1, {
        // Does not work.
    })

    workAsMethod(amount: 1) {
        // Works.
    }

    work = { (amount, completionHandler) in
        // Does not work
        completionHandler()
    }

    return true
}

func workAsMethod(amount: Int, completionHandler: @escaping (() -> ())) {
    // Works
    completionHandler()
}

当我使用带有可调用块以指示工作已完成的方法时,它会工作。当我尝试在闭包(闭包内部的闭包)中执行相同的操作时,我无法使其正常工作。

在闭包内部调用闭包以通知“侦听器”工作已完成的正确语法是什么?

1 个答案:

答案 0 :(得分:1)

work闭包的类型需要工作:

var work: ((Int, _ completionHandler: () -> ()) -> ())?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Use optional chaining here to unwrap work before calling
    work?(1, {
        // This now works.
    })

    workAsMethod(amount: 1) {
        // Works.
    }

    work = { (amount, completionHandler) in
        // This now works
        completionHandler()
    }

    return true
}

func workAsMethod(amount: Int, completionHandler: @escaping (() -> ())) {
    // Works
    completionHandler()
}

work是一个可选的闭包,它包含一个Int和一个() -> (),并且不返回任何-> ()

如果您分解work的类型,则您的completionHandler的类型为(() -> ()) -> (),这意味着您的completionHandler采用() -> ()闭包,但不返回任何内容。您不希望completerHandler接受任何参数。由于()的放置不正确,因此您的work实际上是可选元组,而不是闭包类型。