Passing optional callback into Swift function

FunctionCallbackFunctional ProgrammingSwift

Function Problem Overview


I'm learning Swift lang, but I cannot pass optional callback argument into function:

func dismiss(completion: () -> Void) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}

This shows me an error - Type () -> Void does not conform to protocol 'LogicValue'

Any suggestions?

Function Solutions


Solution 1 - Function

Update for Swift 3/4:

An optional is no longer a boolean expression, and the deprecated func dismissModalViewControllerAnimated(animated: Bool) is no longer available in Swift.

Simply declare the completion parameter as an optional closure, and pass it on to

func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)

which takes an optional closure as well:

func dismiss(completion: (() -> Void)? = nil) {
	self.dismiss(animated: true, completion: completion)
}

Old (Swift 1.x?) answer:

Declare the completion parameter as (implicitly unwrapped) optional closure (() -> Void)!:

func dismiss(completion: (() -> Void)!) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}

But note that you can call

self.dismissViewControllerAnimated(true, completion: completion)

in any case, because the completion parameter of that function is optional as well. And

func dismissModalViewControllerAnimated(animated: Bool)

is actually marked as deprecated.

Solution 2 - Function

Just adding to Martin R's answer above..

The callback can be optional, instead of implicit parameter (with exclamation mark), use the optional operator.

func dismiss(completion: (() -> Void)?) {
    if completion != nil {
        return self.dismissViewControllerAnimated(true, completion: completion!)
    }

    self.dismissModalViewControllerAnimated(true)
}

Solution 3 - Function

It's better to add = nil in the callback declaration, to avoid passing nil while calling it:

func dismiss(completion: (() -> Void)? = nil) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true) }

And you can call your function like this : dismiss()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKosmetikaView Question on Stackoverflow
Solution 1 - FunctionMartin RView Answer on Stackoverflow
Solution 2 - FunctionMatejView Answer on Stackoverflow
Solution 3 - FunctionRémyView Answer on Stackoverflow