2014-09-19 43 views
6

我正在尝试执行以下操作。使用swift铸造具有泛型参数的struct

protocol Vehicle { 

} 

class Car : Vehicle { 

} 

class VehicleContainer<V: Vehicle> { 

} 

let carContainer = VehicleContainer<Car>() 
let vehicleContainer = carContainer as VehicleContainer<Vehicle> 

,但我得到的最后一行的编译错误:

'Car' is not identical to 'Vehicle' 

对此有什么解决办法?

另外我相信这种类型的铸造应该是可能的,因为我可以用基于泛型构建的数组来完成。以下作品:

let carArray = Array<Car>() 
let vehicleArray = carArray as Array<Vehicle> 
+0

不知道这是否与它有任何关系,但'Array'是一个值类型。试着用'struct'来重新构造你的上面的层次结构,看看你是否仍然有同样的错误。 – martineno 2014-09-19 08:13:00

+0

是的,我试过已经用VehicleContainer作为Struct,它给出了相同的错误 – hoddez 2014-09-20 09:55:31

+0

你有没有想过这个? – joslinm 2015-02-13 16:09:06

回答

0

迅速扩大在操场上你的阵列例如按预期工作

protocol Vehicle { 

} 

class Car : Vehicle { 

} 

class Boat: Vehicle { 

} 

var carArray = [Car]() 
var vehicleArray : [Vehicle] = carArray as [Vehicle] 
vehicleArray.append(Car()) // [__lldb_expr_183.Car] 
vehicleArray.append(Boat()) // [__lldb_expr_183.Car, __lldb_expr_183.Boat] 

有没有做太多的工作,迅速仿制药,但在swift docs

struct Stack<T: Vehicle> { 
    var items = [Vehicle]() 
    mutating func push(item: Vehicle) { 
     items.append(item) 
    } 
    mutating func pop() -> Vehicle { 
     return items.removeLast() 
    } 
} 
快速寻找

和使用车辆代替通用类型T

var vehicleStack = Stack<Vehicle>() 
vehicleStack.push(Car()) 
vehicleStack.push(Boat()) 
var aVehicle = vehicleStack.pop() 

似乎在应用程序中编译aok(游乐场有一些处理它的问题,虽然)