Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nested closures does not like argument list

A UIView needs to change a warning label depending on the completion handler of a custom control:

    voucherInputView.completionHandler = {[weak self] (success: Bool) -> Void in

        self?.proceedButton.enabled = success
        self?.warningLabel.alpha = 1.0

        if success
        {
            self?.warningLabel.text = "Code you entered is correct"
            self?.warningLabel.backgroundColor = UIColor.greenColor()
        }
        else
        {
            self?.warningLabel.text = "Code you entered is incorrect"
            self?.warningLabel.backgroundColor = UIColor.orangeColor()
        }


        UIView.animateWithDuration(NSTimeInterval(1.0), animations:{ ()-> Void in
            self?.warningLabel.alpha = 1.0
        })

The final animation block shows an error in the form.

Cannot invoke 'animateWithDuration' with an argument list of type '(NSTimeInterval), animations: ()-> Void)'

If i call this somewhere outside of the completion closure it works.

like image 354
Ilker Baltaci Avatar asked Sep 24 '14 16:09

Ilker Baltaci


1 Answers

The problem is that the closure is implicitly returning the result of this expression:

self?.warningLabel.alpha = 1.0

but the closure itself is declared as returning Void.

Adding an explicit return should resolve the problem:

UIView.animateWithDuration(NSTimeInterval(1.0), animations: { ()-> Void in
    self?.warningLabel.alpha = 1.0
    return
})
like image 95
Antonio Avatar answered Oct 05 '22 08:10

Antonio