1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
* 星球访问者接口 */ protocol PlanetVisitor { func visit(planet: Earth) func visit(planet: Mars) func visit(planet: Venus) }
* 行星类 */ protocol Planet { func accept(visitor: PlanetVisitor) }
class Earth: Planet { func accept(visitor: PlanetVisitor) { visitor.visit(self) } }
class Mars: Planet { func accept(visitor: PlanetVisitor) { visitor.visit(self) } }
class Venus: Planet { func accept(visitor: PlanetVisitor) { visitor.visit(self) } }
class NameVisitor: PlanetVisitor { var name = "" func visit(planet: Earth) { name = "Earth" } func visit(planet: Mars) { name = "Mars" } func visit(planet: Venus) { name = "Venus" } }
let planets: [Planet] = [Earth(), Mars(), Venus()]
let names = planets.map { (planet: Planet) -> String in let visitor = NameVisitor() planet.accept(visitor) return visitor.name }
print(names)
|