向下转型失败

Downcasting fails

我遇到了一些不寻常的向下铸造失败。

我在FrameworkA

中有一个classVehicle

框架A

open class Vehicle {
    open var name: String = ""
}

我在其他项目中 class 编辑了这个 Vehicle class。

项目

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 class 的扩展并使用 associatedObject。有没有办法subclass和downcast?

这不是沮丧...CarVehicle,但 Vehicle 不是 Car

当然你的代码失败了。与使用框架无关

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.