Я позволил себе создать пример структуры имеющихся у вас классов, поскольку вы не предоставили реализацию этих классов:
class Grid {
let contains: SomeProtocol
init(contains: SomeProtocol) {
self.contains = contains
}
}
class Map {
let squares: [[Grid]]
init(squares: [[Grid]]) {
self.squares = squares
}
}
Как видите, contains
свойство имеет тип SomeProtocol, который определяется следующим образом:
protocol SomeProtocol {
func displayBug()
}
Далее идут классы, реализующие этот протокол (это всего лишь пример, иллюстрирующий, что реализация метода displayBug
может различаться):
class Bug: SomeProtocol {
func displayBug() {
print("called from Bug")
}
}
class Foo: SomeProtocol {
func displayBug() {
print("called from Foo")
}
}
class Bar: SomeProtocol {
func displayBug() {
print("called from Bar")
}
}
class Buz: SomeProtocol {
func displayBug() {
print("called from Buz")
}
}
Теперь, когда иерархия установлена, мы можем проверить ее:
let map = Map(squares: [
[
Grid(contains: Bug()),
Grid(contains: Foo())
],
[
Grid(contains: Bar()),
Grid(contains: Buz())
]
])
for gridArray in map.squares {
for grid in gridArray {
grid.contains.displayBug()
}
}
, вызванный из Bug
, вызванный из Foo
звонили из бара
звонили из Буз