Skip to content

Instantly share code, notes, and snippets.

struct AK47:Weapon{
func fire(){
print("Firing with AK47")
}
}
let player = Player()
player.currentWeapon = AK47()
player.currentWeapon?.fire() // prints "Firing with AK47"
protocol Explosive{
func detonate()
}
struct Grenade:Explosive{
func detonate(){
print("A grenade exploded!")
}
}
struct WeaponAdapterForExplosive:Weapon{
var explosive:Explosive
func fire(){
self.explosive.detonate()
}
}
player.currentWeapon = WeaponAdapterForExplosive(explosive:Grenade())
player.fire()
// all implementation of Explosve that also implements Weapon, call `detonate` in `fire` method
extension Explosive where Self:Weapon{
func fire(){
self.detonate()
}
}
// Finally, extend Grenade to Weapon
extension Grenade:Weapon{}
// Entity One: Weapon
protocol Weapon{
func fire(); // Weapon can be fire
}
// The Context: Player, who can fire a weapon
class Player{
var currentWeapon:Weapon?;
// Fire: call the `fire` method of the weapon