Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Example of type erasure with Pokemon
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 AnyPokemon <PokemonType>: Pokemon {
private let _attack: ((PokemonType) -> Void)
required init<U:Pokemon where U.PokemonType == PokemonType>(_ pokemon: U) {
_attack = pokemon.attack
}
func attack(type:PokemonType) {
return _attack(type)
}
}
let thunderAttack = Thunder()
let fireAttack = Fire()
let pikachu: AnyPokemon<Thunder>
pikachu = AnyPokemon(Pikachu())
pikachu.attack(thunderAttack)
let raichu: AnyPokemon<Thunder>
raichu = AnyPokemon(Raichu())
raichu.attack(thunderAttack)
let electricPokemon = [pikachu, raichu]
for pokemon in electricPokemon {
pokemon.attack(thunderAttack)
}
let charmander: AnyPokemon<Fire>
charmander = AnyPokemon(Charmander())
charmander.attack(fireAttack)
@eonist

This comment has been minimized.

Copy link

commented Mar 9, 2017

Awesome! Did you ever build something with type erasure?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.