转发失败

时间:2016-12-21 23:15:33

标签: swift downcast

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

我在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

如果它们位于相同的框架(或相同的项目命名空间)中,则没有问题,但在这种情况下,从VehicleCar的向下转换失败。

错误信息如下所示。

Could not cast value of type 'FrameworkA.Vehicle' (0x1070e4238) to 'Project.Car' (0x10161c120).

所以我不得不使用Vehicle类的扩展并使用了associatedObject。有没有办法进行子类化和向下传播?

2 个答案:

答案 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)

这不是堕落的... CarVehicle,但Vehicle不是Car