Function types are declared like:
var mathFunction: (Int, Int) -> Int
In this example: mathFunction is a variable that can hold any function that takes two Int as parameters and returns one Int. Fine, so far.
Functions can take such functions as parameters and also return them. For instance, a function taking a function like the above as parameter would be declared as:
func printMathResult(mathFunction: (Int, Int) -> Int)
A function returning a function taking a Bool as parameter and returning an Int could look like:
func chooseFunction(choice: Bool) -> (Int) -> Int
Notice how the two pointer operators (->) mean to entirely different things. The first indicates a return value, the second is part of the function signature of the returned value.
Let’s imagine what a function type would look like if it takes a function of an Int, returning an Int as parameters, and returns a similar function:
func confusingFunction(number: Int) -> (Int) -> (Int) -> Int
I may very well have written that wrong, but can you tell? This is totally different from old school C declaration of function prototypes, but I’m far from sure it’s any easier to understand. Maybe judicious use of “function types” (or “typedefs” as we used to call them 30 years ago…) could make this clearer.