我有一个函数,它接受Being
类型的实例。 Being
有两个子类:Person
和Animal
。我希望函数能够识别两者中的哪一个被传递,并使用特定于每个子类的属性执行某些操作。
我认为这样可行:
func fight(attacker1: Being, attacker2: Being) -> String {
if attacker1 is Person {
let name1 = attacker1.name as! Person //Error: Value of type Being has no member name
} else {
print("Its not a person")
}
但它没有。什么是实现我想要的最顺利/最短的方式?
答案 0 :(得分:6)
您应该创建所需类型的新变量,并将参数放入此变量中。
func fight(attacker1: Being, attacker2: Being) -> String {
if let att1 = attacker1 as? Person {
let name1 = att1.name
} else {
print("Its not a person")
}
这样,如果attacker1是Person,您只需将此值保存到att1常量中,稍后您可以将此常量用作 Person 类型的实例。
答案 1 :(得分:2)
虽然@ V.Khambir的代码可行并且可能是更好的解决方案,但它没有指出你的代码问题。您正在尝试将.name
投射到Person
。 .name
不是attacker1
的属性,这就是您收到错误的原因。您要做的是将attacker1
转换为Person
,然后访问name属性。
func fight(attacker1: Being, attacker2: Being) -> String {
if attacker1 is Person {
let name1 = (attacker1 as! Person).name
} else {
print("Its not a person")
}
答案 2 :(得分:0)
由于Being是一个基类,所以它不能访问任何子类属性。首先,您必须检查attacker1和attacker2的类型。例如:如果attacker1属于Person类型,那么您可以将其类型转换为Person类型的实例,然后访问person对象的属性。 注意: - 确保先检查类型,然后输入它,否则它会崩溃。