Swift中的多态性(如果没有)

Swift中的多态性(如果没有),swift,polymorphism,Swift,Polymorphism,我有一个swift代码:解释多态性的概念 //Polymorphism class Person { var name:String="Guest" var age:Int=0 init(name:String) { self.name=name self.age=0 } init(name:String, age:Int) { self.name=name self.age=age } func Update(name:String) { sel

我有一个swift代码:解释多态性的概念

//Polymorphism


class Person {
var name:String="Guest"
var age:Int=0

init(name:String) {
    self.name=name
    self.age=0
}
init(name:String, age:Int) {
    self.name=name
    self.age=age
}

func Update(name:String) {
    self.name=name
}
func Upgrade() {
    self.age++
}
}



class Student:Person
{
var average:Float=100
func IsOk()->Bool {
    return average > 80
}
init(name:String, average:Float) {
    super.init(name: name)
    self.average=average
}
}


class Teacher:Person {
var Salary:Float=2000
init(name:String, age:Int, Salary:Float){
    super.init(name: name, age: age)
    self.Salary=Salary

}
func GetNetSalary()->Float {
    return 0.8*self.Salary
}

override func Upgrade() {
    super.Upgrade()
    Salary*=1.1 // add 10% to salary
}
}



var t1:Teacher=Teacher(name: "Ahmed", age: 28, Salary: 3000)
var st1=Student(name:"Test", average: 70)

var p1:Person=Person(name: "abc")
var p2:Person=Student(name: "Student1", average: 100) //up casting
var p3:Person=Teacher(name: "Teacher", age: 40, Salary: 3008)


var arr=[t1, st1, p1, p2, p3] //array of persons and teachers and students

for instance in arr {
if instance is Student {println("This is student")}
if instance is Teacher {println("This is teacehr")}  
}
在for循环的最后,我如何设置这样一个条件来确定数组中的元素是否只是一个人? 因为当我打字时:

if instance is Person {println("This is a Person")}

这给了我一个错误,因为这个条件总是正确的

也许您可以测试该元素是否为
教师
?如果不是,则必须是

试试这个:

for instance in arr {
    if instance.dynamicType == Person.self {print("This is a Person")}
    if instance.dynamicType == Student.self {print("This is student")}
    if instance.dynamicType == Teacher.self {print("This is teacehr")}
}
有关这方面的更多信息,请参见。

已编辑

你在问:

我怎么能设置这样一个条件来判断数组中的元素是否只有一个人


在强静态类型化语言中,如果无法访问对象的运行时类型,则无法执行此操作。但是,在Swift中,您可以通过
dynamicType
方法使用语言的反射属性来获得这样的类型。

我应该说@Renzo的答案已经过时,
dynamicType
已被弃用。你们必须使用这个方法。还有一个建议:如果您想知道可选对象的确切类型,请先将其展开,然后将其传递给
type(of:)

class A{}
B类:A{}
b:A?=B()
打印(“\(类型:b))”//您将得到可选的(A)
如果让温度=b{
打印(“\(类型:temp))”//您将得到(B)
}

isKindOfClass提供了什么样的输出?将来可能重复的,从将问题归结为复制问题的绝对必要示例开始。这段代码与此相去甚远。你的数组是什么类型的<代码>[个人]?如果不是
老师
,可能是
学生
。如果我们添加一个
看门人
家长
校长
顾问
,等等,会发生什么呢?现在突然在别处添加代码会破坏这里的代码,无论这个测试在哪里。。。另外,正如我的评论链接的问题所显示的,我们可以只检查确切的类…哦,对不起,这是我的错,也许你可以与类名称进行比较。哦,什么?如果对象是
Person
——而不是子类——
dynamicType
将反映这一点。不管变量的类型是什么……例如,在这种语言中,您无法访问对象的运行时类型?例如OCaml,其中类型信息在编译时完全管理,在运行时不存在。