Demystifying Views in iOS · Parent Views |

This is a companion discussion topic for the original entry at

I have a quibble about the implementation of the completion closure of UIView.animate method in the animateIn method shown at the end of the video. It’s admittedly quite clever to use a map function to determine whether the handleCompletion closure passed in as a parameter is nil or not, but it’s probably also not at all obvious what’s going on or how it works at first glance. (At least it wasn’t for me.)

If the intention is something like, “For the the completion closure of UIView.animate method, call the handleCompletion closure if it’s non-nil.”, couldn’t this be written much more simply like the code below?

completion: { _ in handleCompletion?() }

@catie @jessycatterwaul @jcatterwaul Can you please help with this when you get a chance? Thank you - much appreciated! :]

completion: { _ in handleCompletion?() } dictates: “When the animation completes, disregard whether or not the animation actually finished, and call handleCompletion if it is has a value.”

What we did in the video is equivalent to this (I think of as a common abbreviation for this sort of guard statement):

completion: {
  guard let handleCompletion = handleCompletion
  else { return nil }

  return { _ in handleCompletion() }
} ()

That dictates: “When the animation completes, don’t do anything. …unless handleCompletion had a value! If it did, disregard whether or not the animation actually finished, and call handleCompletion.”

On one hand, I appreciate the simplicity of your solution in terms of lines of code. But on the other, we know that handleCompletion can be checked for a value before the animation is complete, so waiting until that point isn’t necessary, and Swift unfortunately doesn’t make it as concise to describe that. Because it is cumbersome to be that explicit, I wouldn’t fault you for going with the option you proposed. I appreciate you asking about this; Catie and I had to ask ourselves how we ought to go about it as well!

Thanks for your reply. I appreciate the clarification, and it’s nice to know that we were thinking along the same lines about how this code should work.

1 Like