Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing optional callback into Swift function

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?

like image 499
Kosmetika Avatar asked Jun 28 '14 12:06

Kosmetika


3 Answers

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.

like image 111
Martin R Avatar answered Nov 18 '22 18:11

Martin R


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)
}
like image 42
Matej Avatar answered Nov 18 '22 17:11

Matej


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

like image 14
Rémy Virin Avatar answered Nov 18 '22 17:11

Rémy Virin