2014-09-19 3 views
6

Я пытаюсь сделать следующее.Кастинг 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

+0

Да, я пробовал это уже с VehicleContainer как Struct, и он дает ту же ошибку – hoddez

+0

Вы когда-нибудь это понимали? – joslinm

ответ

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 в приложении (площадка имеет некоторые проблемы обработки его, хотя)