Tutorial: Swift Type Erasure Explained

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

by The Captain

May 7, 2024
Tutorial: Swift Type Erasure

Swift Type Erasure: A Tutorial

When working with protocols and generics in Swift, you may encounter situations where you need to hide the underlying type of an object or enforce a specific type constraint. This is where Swift's type erasure feature comes in handy. Type erasure allows you to define a concrete type that hides the details of another type, making it easier to work with protocols and generic types in a more flexible and reusable way.

Using Type Erasure

One common use case for type erasure is when you want to work with protocols that have associated types. By using type erasure, you can create a concrete type that conforms to the protocol without needing to specify the associated type. This makes it easier to work with heterogeneous collections of objects that conform to the same protocol.

protocol Printable {
    var description: String { get }

struct AnyPrintable: Printable {
    private let _description: () -> String

    init(_ base: T) {
        _description = { base.description }

    var description: String {
        return _description()

struct Person: Printable {
    var name: String

    var description: String {
        return "Person: \(name)"

let anyPerson = AnyPrintable(Person(name: "John Doe"))

Benefits of Type Erasure

Using type erasure in Swift can help you write more flexible and reusable code by abstracting away the underlying types of objects. This can be particularly useful when working with frameworks or APIs that rely heavily on protocols and generics. Type erasure simplifies the process of working with complex types and allows you to focus on the functionality of your code without getting bogged down in implementation details.


Swift's type erasure feature is a powerful tool for working with protocols and generics in a more flexible and reusable way. By using type erasure, you can create concrete types that hide the underlying type details, making your code more modular and easier to maintain. Experiment with type erasure in your own projects to see how it can improve the flexibility and readability of your Swift code.