如何在 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 中创建一个我可以选择调用的完成处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中创建可重用视图并添加完成处理程序

Swift/Firestore:完成不会被调用

如何在 Swift 中创建像指南针一样的“滑动视图”?

如何在 Swift iOS 中创建一个通用的弹出视图控制器

如何在 iOS swift 3 中创建单独的文件夹

Swift 异步方法和返回/完成块