Ios Swift:继承的对象

Ios Swift:继承的对象,ios,swift2,Ios,Swift2,当我将派生类用于以基类为参数的函数时,收到一条奇怪的消息: class Vehicle: Object, Mappable, Hashable, Equatable { ... } class Car: Vehicle { ... } class TransportFactory: NSObject{ func doSomethingWithVehicles(vehicles:[Vehicle]){ ... } } class CarFactor

当我将派生类用于以基类为参数的函数时,收到一条奇怪的消息:

class Vehicle: Object, Mappable, Hashable, Equatable {
    ...
}

class Car: Vehicle {
    ...
}

class TransportFactory: NSObject{

    func doSomethingWithVehicles(vehicles:[Vehicle]){
    ...
    }

}

class CarFactory: TransportFactory{

    let myCars = [Car]()

    doSomethingWithVehicles(myCars)
} 
这导致:“无法将类型为“[Car]”的值转换为预期的参数类型“[Vehicle]”


对象是一个类(领域)、可映射的协议(AlamofireMapper)、可散列且可平等的协议(来自Foundation)

您在声明myCars时没有类型,并为其分配一个包含您的
Car
类的
数组,因此类型推断实际上是给您一个包含类对象的
数组。尝试:

let myCars = [Car]()
self.doSomethingWithVehicles(myCars)

这就是为什么我更喜欢
数组
语法而不是
[Car]
。我觉得代码更清晰/更安全,因为
let myCars=Array
不会编译。

您需要将
doSomethingWithVehicles
包装在一个函数中,您不能将其挂在类范围中:

class Vehicle: NSObject {
    //    ...
}

class Car: Vehicle {
    //    ...
}

class TransportFactory: NSObject {

    func doSomethingWithVehicles(vehicles:[Vehicle]){
        //        ...
    }

}

class CarFactory: TransportFactory {

    let myCars = [Car]()

    func someFunc() {
        self.doSomethingWithVehicles(myCars)
    }
}

myCars
可以在类范围内,因为它是一个类变量。

谢谢-这是我在编写这个抽象示例时犯的一个错误。在我上面的帖子中修复了它。@netshark1000
self。
在方法名称前面也是一个问题。否则,这段代码就可以为我编译。@netshark1000我认为您的代码可能仍然无法编译,因为您在类中有一个函数调用,而不是在方法中。很明显,您发布的代码很好,因此您要通过简化来删除项目中的其他内容。将您提供的内容粘贴到项目中,只要将该函数调用放在一个方法中,您就会看到它工作正常。doSomethingWithVehicles是TransportFactory中的一个方法。因此,此解决方案不起作用,请在您的问题中添加
TransportFactory
。添加了车辆的实际继承对象和协议即使使用继承对象和协议,如果在函数调用中包装
doSomethingWithVehicles
,我也无法重现您的错误。我的回答对您有帮助吗?如果您还有其他问题,请告诉我。添加了vehicleI的实际继承对象和协议无法重现您的问题(至少在Xcode 7.1.1中)。我不熟悉
Mappable
,但如果这就是问题所在,我会感到惊讶。我建议你创造问题的根源。看起来您是在从代码中剪切和粘贴,但是相反,请从头开始创建一个简单的示例,以体现您所讨论的行为。
import Foundation

class Vehicle: NSObject{
}

class Car: Vehicle {
}

class TransportFactory: NSObject{

    func doSomethingWithVehicles(vehicles:[Vehicle]){
        print("Number of vehicles:", vehicles.count)
    }

}

class CarFactory: TransportFactory {

    let myCars = [Car]()

}

let carFactory = CarFactory()
carFactory.doSomethingWithVehicles(carFactory.myCars)
/* print out

Number of vehicles: 0

*/