在Swift中将变量更改为子类

在Swift中将变量更改为子类,swift,inheritance,Swift,Inheritance,在Swift中,如果我有一个基类和两个继承自它的类,它们有自己的属性。如果我将一个变量分配给基类,然后再将其更改为子类,则无法访问所述属性。这里有一个非常愚蠢的例子。这是我在紧要关头能想到的。 如何将一个变量初始设置为基类,并将其转换为子类并访问所述子类的属性?您需要向下转换变量。因此,print(a.socks)应替换为 if a is Human { print((a as! Human).socks) } 或使用附加变量 if let b = a as? Human { pri

在Swift中,如果我有一个基类和两个继承自它的类,它们有自己的属性。如果我将一个变量分配给基类,然后再将其更改为子类,则无法访问所述属性。这里有一个非常愚蠢的例子。这是我在紧要关头能想到的。


如何将一个变量初始设置为基类,并将其转换为子类并访问所述子类的属性?

您需要向下转换变量。因此,
print(a.socks)
应替换为

if a is Human {
  print((a as! Human).socks)
}
或使用附加变量

if let b = a as? Human {
  print(b.socks)
}
upd:

您也可以使用
防护装置
实现这一点:

guard let a = a as? Human
  else { return }
print(a.socks)

这是面向对象编程中非常常见的场景

R.K.的回答完全正确。我只想在这里添加另一种实现相同结果的方法

您可以使用开关查找正确类型的变量并执行向下转换:

var some : Animal?

some = Human() // or some = Dog() or some = Animal()

switch some {
case let human as Human: print("It's a human with \(human.socks) socks")
case let dog as Dog: print("It's a Dog! The collar says: \(dog.collar)")
default: print("It's some unknown kind of animal")
}
希望这有帮助

var some : Animal?

some = Human() // or some = Dog() or some = Animal()

switch some {
case let human as Human: print("It's a human with \(human.socks) socks")
case let dog as Dog: print("It's a Dog! The collar says: \(dog.collar)")
default: print("It's some unknown kind of animal")
}