Well, good API does take a lot of iteration. So it'd be fair to say that old API won't play well with new syntax. Still, how about we start with:
func with(
duration: Double,
animate: @escaping () -> Void,
onComplete: ((Bool) -> Void)? = nil)
view.with(duration: 0.0, animate: defeatEnemy, onComplete: updateScore)
view.with(duration: 0.0, animate: defeatEnemy)
onComplete: { ... }
view.with(duration: 0.0)
animate: { ... }
onComplete: { ... }
I'd say the reason I'm advocating for requiring the first label is that the API guideline doesn't need to play guessing game regarding whether the label is being dropped. I think It's a big plus from design perspective.