我遇到了一些不寻常的铸造失败。
我在Vehicle
FrameworkA
FrameworkA
open class Vehicle {
open var name: String = ""
}
我在其他项目中将这个Vehicle
类继承了。
项目
import FrameworkA
class Car: Vehicle {
var maker: String = ""
}
我试着像这样沮丧
let vehicle = Vehicle()
let car = vehicle as! Car
如果它们位于相同的框架(或相同的项目命名空间)中,则没有问题,但在这种情况下,从Vehicle
到Car
的向下转换失败。
错误信息如下所示。
Could not cast value of type 'FrameworkA.Vehicle' (0x1070e4238) to 'Project.Car' (0x10161c120).
所以我不得不使用Vehicle
类的扩展并使用了associatedObject。有没有办法进行子类化和向下传播?
答案 0 :(得分:3)
当然你的代码失败了。它与使用框架无关。
Car
是一种特殊的Vehicle
。您正在创建Vehicle
对象。然后,您尝试将其强制转换为Car
。但它不是Car
。这是一个Vehicle
。
以下作品:
let car = Car()
let vehicle: Vehicle = car
这很好,因为您创建的Car
也是Vehicle
。
你也可以这样做:
let vehicle: Vehicle = Car()
let car = vehicle as! Car
这是有效的,因为即使vehicle
被声明为Vehicle
,它实际指向的对象也是Car
。
答案 1 :(得分:2)
这不是堕落的... Car
是Vehicle
,但Vehicle
不是Car
。