这是我的代码:
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()
}
当我使用带有可调用块以指示工作已完成的方法时,它会工作。当我尝试在闭包(闭包内部的闭包)中执行相同的操作时,我无法使其正常工作。
在闭包内部调用闭包以通知“侦听器”工作已完成的正确语法是什么?
答案 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
实际上是可选元组,而不是闭包类型。