Advanced Swift Feature: Generics

A portrait painting style image of a pirate holding an iPhone.

by The Captain

on
April 15, 2023

Advanced Swift Feature: Generics

Generics in Swift are a powerful tool that allows you to write flexible and reusable code by defining types and functions in a way that supports multiple types. This can be particularly useful when writing code that needs to work with different types of data, such as collections, algorithms, or networking operations. Here we will look at a basic example of how to use generics in Swift.

Declaring a Generic Function

The syntax for declaring a generic function in Swift is as follows:

func functionName<T>(parameters: T) -> T {

Where T is the placeholder for the type that will be passed into the function. In the function body, you can use T as though it is a concrete type.

Example Code Snippet

Here is a simple example of a generic function that takes an array of any type and returns the first element of that array:

func getFirstElement<T>(of array: [T]) -> T? {
  return array.first
}

You can call this function with any array of any type:

let myIntArray = [1, 2, 3, 4, 5]
let myStringArray = ["apple", "banana", "cherry", "durian"]

let firstInt = getFirstElement(of: myIntArray)
let firstString = getFirstElement(of: myStringArray)

Here, firstInt and firstString will have types Int? and String? respectively.

Constraints on Generic Types

You can also add constraints to your generic types to specify that they must conform to a protocol, inherit from a certain class, or have a specific initializer. Here is an example that adds a constraint to our generic function to ensure that the input array contains only types that conform to the Equatable protocol:

func getIndexOf<T: Equatable>(element: T, in array: [T]) -> Int? {
  return array.firstIndex(of: element)
}

You can call this function with any array of Equatable types:

let myIntArray = [1, 2, 3, 4, 5]
let myStringArray = ["apple", "banana", "cherry", "durian"]

let indexInt = getIndexOf(element: 3, in: myIntArray)
let indexString = getIndexOf(element: "cherry", in: myStringArray)

Here, indexInt and indexString will have types Int? and Int? respectively.

Conclusion

Generic programming is just one of many advanced features of Swift. By using generics, you can write highly flexible and reusable code that can work with a variety of different data types.