一个超类的数组是否也包含子类?

时间:2017-11-05 16:56:13

标签: ios swift

我创建了一个班级Person。人员包含姓名和电子邮件等属性。两者都来自String类型。

Person类旁边,我有一个继承自超类Student的子类Person。子类Student包含学生编号(String)和isGraduated(Boolean)等属性。

我有一个来自班级Person的空数组,例如:

var persons: [Person]()

在数组人员中创建Person和Student对象后,我使用UITableView读出它们。两种型号都将在细胞中打印。但是当我想从所选行检查isGraduated的值时,自动完成不会给我属性的值:persons.isGraduated

首先想到这个问题的是,我的persons数组是否也包含子类Student?我的第二个想法是,我认为我不应该检查TableView中的值isGraduated。我希望这个功能是它可以做一些事情,比如如果这个人毕业就打电话给原生相机。

期待解决方案。

2 个答案:

答案 0 :(得分:5)

树选项

答:将数组类型更改为学生

var students: [Student]()

B:将人员阵列中的每个元素投射到学生。理想情况下,每个人都在里面。

guard let student = person as? Student else{
     return // or continue if inside a for loop
}

然后你将可以访问该学生变量。

C:或者如果他们可能同时是阵列中的学生和人员那么

for person in persons{
   switch person{
   case let student as Student:  //student case
      //do something
   default: //person case
      //do something 
   }
}

答案 1 :(得分:0)

如果您想查看您的人的类型:您可以使用is关键字的人或学生:

 if persons[0] is Person {
    //if a person
} else if persons[0] is Student {
    //if a student
}

如果您想为特定类型使用功能成员,则需要使用关键字as 向下转换该类型:

if let person = persons[0] as? Person {
    //person is now a Person type
} else if let student = persons[0] as? Student {
    //student is now a Student type
}