如何在 Swift 中创建一个我可以选择调用的完成处理程序?
Posted
技术标签:
【中文标题】如何在 Swift 中创建一个我可以选择调用的完成处理程序?【英文标题】:How to create a completion handler in Swift which I would call optionally? 【发布时间】:2018-12-08 14:59:35 【问题描述】:目前,我有一个完成处理程序:
open func Start(completion: (() -> Void)) ...
但在这种情况下,我必须始终调用completion
。
我怎样才能做一个可选的,所以在某些方法中我会使用 completion
块,但在其他方法中我会跳过它们而不添加到我的方法调用中?
例如,我想要的一样:
self.present(<#T##viewControllerToPresent: UIViewController##UIViewController#>, animated: <#T##Bool#>, completion: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>)
我试过了
open func Start(completion: (() -> Void)? = nil) ...
添加问号,但在这种情况下我必须调用可选的完成块
completion?()
我不能简单地打电话
start()
在完成块中我不需要的地方。它需要我调用它
【问题讨论】:
您的代码运行良好。您可以直接拨打start()
。它可以按照您的意愿工作。
【参考方案1】:
您可以将其设为可选参数,默认为nil
值:
open func Start(completion: (() -> Void)! = nil)
guard completion != nil else
return
completion()
在其他方法中:
func foo()
Start()
Start(completion: nil)
Start(completion:
// some code
)
Start
// some code
【讨论】:
我也试过了。它仍然要求我调用完成块。这就是为什么我决定在这里提出一个问题 =/ @J.Doe 您现在应该可以简单地调用 start() 了,不知道为什么会遇到问题。您使用的是哪个 Swift 版本?另外,请检查我的更新答案。 最新的 Swift 4.2 它应该可以工作,除非你有一些不相关的问题。 将一个变量声明为隐式解包然后给它一个初始值 nil 似乎是错误的。只需将其设置为正常的选项即可。摆脱guard
。将呼叫更改为completion?()
,一切正常。但是然后我们回到问题中的原始代码 - 工作得很好。【参考方案2】:
您可以使用不是nil
的默认值,例如一个什么都不做的块
open func start(completion: @escaping (() -> Void) = )
但是,我看不出你打电话给completion?()
有什么问题。
【讨论】:
问题中的代码没有问题。这个答案(和另一个)似乎是不必要的。以上是关于如何在 Swift 中创建一个我可以选择调用的完成处理程序?的主要内容,如果未能解决你的问题,请参考以下文章