TypeErasure.swift @ӚԋU V�ԋU class Thunder { } class Fire { } protocol Pokemon { typealias PokemonType func attack(move:PokemonType) } struct Pikachu: Pokemon { typealias PokemonType = Thunder func attack(move: Thunder) { /*⚡️*/ } } class Charmander: Pokemon { func attack(move: Fire) { /*🔥*/ } } class Raichu: Pokemon { typealias PokemonType = Thunder func attack(move: Thunder) { /*⚡️*/ } } class
![Example of type erasure with Pokemon](https://cdn-ak-scissors.b.st-hatena.com/image/square/1ef26f6cb4349557952890dbe3e567f7f98dc151/height=288;version=1;width=512/https%3A%2F%2Fgithub.githubassets.com%2Fassets%2Fgist-og-image-54fd7dc0713e.png)