Haris
Haris

Reputation: 129

swift callback doesn't print

I try to understand the main concept of callbacks in swift I have the following code:

typealias ImageHandler = (String,NSError?) -> Void

 func PostOnSocialMedia(image:String?){
    println(0)

    Post({(image)->Void in
     println(1)
    })

    println(2)
}

func Post(handler:ImageHandler){
    println(3)
}

my code output is 0,3,2 and my question is why doesn't print the number 1.

Upvotes: 0

Views: 713

Answers (1)

Airspeed Velocity
Airspeed Velocity

Reputation: 40963

It’s not printing 1 because you are passing in a function that is never called.

This:

Post({ (image)->Void in
     println(1)
})

declares a temporary function (a “closure expression” – a quick easy way to declare anonymous functions, between the { }) that takes an argument of a (String,NSError?) pair, and returns nothing. Then it passes that function into the Post function.

But the Post function does nothing with it. For a function to run, it needs to be called. If you changed your Post function like so:

func Post(handler:ImageHandler){
    println(3)

    // call the handler that was passed in...
    handler("blah",nil)
}

you’ll see it printing a 1.

Note, the image argument received by PostOnSocialMedia and the image argument variable inside the temporary function are two different variables – scoping rules mean the one declared inside the temp function masks the one in the outer scope. But they are very different (in fact, they’re different types – one is a string, and the other is a 2-tuple of a string and an error).

Try reading this for a short intro on first-order functions and closures in Swift.

Upvotes: 1

Related Questions