No se puede usar una subclase concreta para implementar una propiedad en el protocolo en Swift
Estoy haciendo algo similar al Patrón de puente en JAVA,DriverType
es un protocolo requiere una propiedad llamadavehicle
ser unaDrivable
objeto,Drivable
también es un protocolo y es adoptado por la clase 'Car'
protocol Drivable {
var speed: Double { get }
}
protocol DriverType {
var vehicle: Drivable { get }
}
class Car: Drivable {
var speed = 80.0;
var brand = "BMW"
}
class Driver: DriverType {
var vehicle: Car = Car() //Error: Type 'Driver' does not conform to protocol 'DriverType'
// This one works, but I have to downcast the property to 'Car' everytime I use it.
var vehicle: Drivable = Car() //Type 'Driver' does not conform to protocol 'DriverType'
}
Cuando implemente elDriver
clase, es muy natural declararvehicle
propiedad comoCar
. Pero luego me encontré con el problema que el compilador piensaDriver
no se ajusta aDriverType
aunqueCar
De acuerdo aDrivable
perfectamente.
ACTUALIZAR:
La respuesta de @Antonio es sólida, pero esto es lo que resolví actualmente, no involucra genéricos con la clase.
protocol Drivable {
var speed: Double { get }
init()
}
protocol DriverType {
func vehicle() -> Drivable
}
class Car: Drivable {
var speed = 80.0;
var brand = "BMW"
required init() {}
}
class Driver: DriverType {
private var m_vehicle: Car = Car()
func vehicle() -> Drivable {
return m_vehicle
}
// Inside Driver class I use the m_vehicle property directly
}