7

I am moving my code from Obj. C to Swift C and trying to implementing the Twitter sdk..

But, I am getting an error... Can any body tell me what I have done wrong.

enter image description here

Please help me with this.

I spent 2 days tried everything but didn't work for me.

R_Developer
  • 864
  • 1
  • 7
  • 10

3 Answers3

16

Your block does not have a return statement, therefore the compiler uses the result of the last statement

UIApplication.sharedApplication().openURL(url)

as return value, which is a Bool and not Void as declared in the block signature.

To solve that problem, just add a return statement:

{ (url: NSURL, oauthToken: String) -> Void in
    UIApplication.sharedApplication().openURL(url)
    return
}
Martin R
  • 529,903
  • 94
  • 1,240
  • 1,382
0

The problem is that openURL returns a boolean, and an attempt to convert it to Void is made, since the closure is declared as returning a Void. Simply remove that as follows:

{ (url: NSURL, token: String)  in
    UIApplication.sharedApplication().openURL(url)
}

If you don't want to change the closure signature, just assign the return value to a variable:

{ (url: NSURL, token: String) -> Void in
    let ret = UIApplication.sharedApplication().openURL(url)
}
Antonio
  • 71,651
  • 11
  • 148
  • 165
0

What's not stated in the other answers is that Swift will implicitly add a return to a single statement closure.

This is how statements like conditionSet.sort {$0.set < $1.set} can work.

This can also result in an unexpected error. To avoid the error, make the closure have 2 statements. The simplest way is to add a return after your original statement as stated in the accepted answer.

Aaron Bratcher
  • 6,051
  • 2
  • 39
  • 70