我有一个用户定义的类Map,其中有一个实例图。地图包含网格类型的用户定义对象的二维数组,称为正方形。 Grid类包含一个名为contains的变量,该变量包含许多可能的用户定义类的一个对象。我试图从Grid模块中调用用户定义的类Bug中的函数。
执行此操作的正确语法是什么?
//within Class Grid
func GenerateImage() -> Int{
if self.containType == 1{
return self.contains.DisplayBug()
}else if self.containType == 2{
return 13
}else{
return 0
}
}
//within class Bug
func DisplayBug() -> Int{
if self.male == false{
return self.direction
}else{
if self.appearance == 1{
switch self.direction{
case 1:
return 5
case 2:
return 6
case 3:
return 7
case 4:
return 8
default:
return 0
}
}else if self.appearance == 2{
switch self.direction{
case 1:
return 9
case 2:
return 10
case 3:
return 11
case 4:
return 12
default:
return 0
}
}else{
return 0
}
}
}
答案 0 :(得分:0)
由于您没有提供这些类的实现,因此我自由地为您所拥有的类建立了示例结构:
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打电话
从酒吧叫来
从布兹(Buz)呼叫