Think of it as a list of tasks you have to do to process something. That function accepts three another functions and does something with them. But before each of the passed functions, let's say you need to do some extra work. So before you handle first function passed, you need to do something, prepare data, make calculations... etc. Using an analogy you can imagine function prepare hot beverage. That function accepts other function: open a box of tea leaves, but before you open that box and do something with it you need to boil water... etc...
so it will look something like this
func makeHotBeverage(firstStep: () -> Void ...) {
boilWater()
firstStep()
...
}
when you call that function it will look like this:
makeHotBeverage {
openBoxOfTeaLeaves()
}
you use openBoxOfTeaLeaves()
here but this function signature i.e. its type is () -> Void.
If next time you want to make coffe you can use it. So it becomes reusable. Boiled water is necessary for coffee too...
makeHotBeverage {
// Water is boiled prior next step is executed as you put that in function declaration.
openBoxOfCoffeeBeans()
....
}
Paul is giving simple print statements in order to avoid writing such long code with different functions. You need to undestandand that you can pass functions in to other functions and order them in certain way as well you can use them as closures.