Closures in Swift

Swift supports anonymous functions, which can form closures. Anonymous functions are useful when you want to define a function inline without having to name it.

import Foundation

// This function `intSeq` returns another function, which
// we define anonymously in the body of `intSeq`. The
// returned function captures the variable `i` to
// form a closure.
func intSeq() -> () -> Int {
    var i = 0
    return {
        i += 1
        return i
    }
}

// In the main part of our program:
// We call `intSeq`, assigning the result (a function)
// to `nextInt`. This function value captures its
// own `i` value, which will be updated each time
// we call `nextInt`.
let nextInt = intSeq()

// See the effect of the closure by calling `nextInt`
// a few times.
print(nextInt())
print(nextInt())
print(nextInt())

// To confirm that the state is unique to that
// particular function, create and test a new one.
let newInts = intSeq()
print(newInts())

To run the program, save it as a .swift file and use the Swift compiler:

$ swift closures.swift
1
2
3
1

The last feature of functions we’ll look at for now is recursion.