我正在关注一个Swift教程,我们编写了一个名为DragImg的UIImageView子类,并在该子类中覆盖了一些函数,即touchesBegan,touchesMoved和touchesEnded。
然后我进入身份检查器,查看我想要应用子类的图像,并将类更改为DragImg,然后将它们作为插座连接到ViewController.swift。
但是,在我的ViewController.swift文件中,我将它们声明为UIImageView对象,即
@IBOutlet weak var HeartImg: UIImageView!
而不是
@IBOutlet weak var HeartImg: DragImg!
即使我没有改变这一点,图像仍然按照我们在子类中编写的函数定义运行。
我不确定为什么这仍然有效,因为我认为超类无法访问子类的功能。这是否意味着上述声明在很大程度上是多余的,唯一有所作为的是改变身份检查员中的类?
有人可以解释一下吗?
答案 0 :(得分:2)
这是正确的,因为您在标识Inspector中使用了DragImg,它实际上是创建实例时使用的类。即使您在UIViewController中使用了UIImageView,它仍然是DragImg对象实例。如果你想拥有UIImageView,那么将标识Inspector更改回UIImageView。
答案 1 :(得分:0)
当你创建一个子类时,你正在定义一个" is-a"关系。你的子类const int ROWS = 10;
const int COLS = 10;
bool mazeEscape(char maze[ROWS][COLS],int row,int col)
{
bool result = false;
if (row < 0 || row >= ROWS || col < 0 || col >= COLS)
return false;
if (mazeEscape(row - 1, col)) // recursively move up
result = true;
else if (mazeEscape(row + 1, col)) // recursively move down
result = true;
else if (mazeEscape(row, col - 1)) // recursively move left
result = true;
else if (mazeEscape(row, col + 1)) // recursively move right
result = true;
// Pick up the bread crump
return result;
if (maze[row][col] == '@')
return true;
if (mazeEscape(row - 1, col)) // recursively move up
return true;
else if (mazeEscape(row + 1, col)) // recursively move down
return true;
else if (mazeEscape(row, col - 1)) // recursively move left
return true;
else if (mazeEscape(row, col + 1)) // recursively move right
return true;
else
return false;
}
是一个(或者我应该说是-a)UIImageView。您应该可以在代码中的任何位置将其称为UIImageView,因为它是一个。
让你的插座参考课程&#39;超类完全可以。