【发布时间】:2019-11-18 21:35:00
【问题描述】:
我试图更深入地理解类型转换,但不明白为什么在这个例子中它是必要的:
class Animal { }
class Fish: Animal { }
class Dog: Animal {
func makeNoise() {
print("Woof!")
}
}
let pets = [Fish(), Dog(), Fish(), Dog()]
我正在阅读以检查上述数组中的类型,我需要运行以下代码:
for pet in pets {
if let dog = pet as? Dog {
dog.makeNoise()
}
}
而且下面的代码会崩溃:
for pet in pets {
if pet == Dog() {
pet.makeNoise()
}
}
它返回以下错误:
error: Learn Swift.playground:24:13: error: value of type 'Animal' has no member 'makeNoise'
pet.makeNoise()
~~~ ^~~~~~~~~
这是为什么呢?最后一段代码不会检查数组中的项是否为 Dog() 吗?
目前,我的猜测是我不完全理解 for 循环中“宠物”的隐式类型。我假设它只是根据数组中项目的类型来猜测类型,在我们的例子中是一个对象。
【问题讨论】:
-
与你关于投射的问题并不真正相关,但你也可以将你的循环写为
for case let pet as Dog in pets { ... },你不必在循环内进行任何投射 -
@dan 看起来干净多了。有什么缺点吗?我不会这么想,但我很好奇你是否知道。
标签: swift loops class typecasting-operator