如何在Swift中创建一个可选的完成处理程序?

时间:2018-12-08 14:59:35

标签: swift completionhandler

当前,我有一个完成处理程序:

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()

在完成块中不需要的位置。需要我叫它

2 个答案:

答案 0 :(得分:4)

默认情况下,您可以将其设为具有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
    }
}

答案 1 :(得分:0)

您可以使用不是nil的默认值,例如什么都不做的块

open func start(completion: @escaping (() -> Void) = {}) {
}

但是,我看不到致电completion?()有什么问题。