2014-09-19 22 views
6

Tôi đang cố gắng thực hiện các thao tác sau.Cấu trúc đúc với thông số chung với swift

protocol Vehicle { 

} 

class Car : Vehicle { 

} 

class VehicleContainer<V: Vehicle> { 

} 

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

Nhưng tôi nhận được lỗi biên dịch trên dòng cuối cùng:

'Car' is not identical to 'Vehicle' 

Có workaround cho điều này?

Ngoài ra tôi tin rằng loại đúc này nên có thể bởi vì tôi có thể làm điều đó với Mảng được xây dựng trên generics. Các công trình sau đây:

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

Không chắc chắn điều này có liên quan gì không, nhưng 'Array' là một loại giá trị. Hãy thử cải cách hệ thống phân cấp ở trên của bạn về 'struct' và xem liệu bạn có gặp lỗi tương tự hay không. – martineno

+0

Vâng, tôi đã thử rằng với VehicleContainer như là một cấu trúc và nó cho cùng một lỗi – hoddez

+0

bạn đã bao giờ con số này ra? – joslinm

Trả lời

0

Mở rộng ví dụ mảng của bạn một cách nhanh chóng trong sân chơi công trình như dự định

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] 

đã không được thực hiện quá nhiều công việc với Generics nhanh chóng nhưng nhìn một cách nhanh chóng tại swift docs

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

và sử dụng phương tiện thay vì loại chung T

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

xuất hiện để biên dịch aok trong ứng dụng (sân chơi có một số vấn đề khi xử lý)

Các vấn đề liên quan