我在做类似于JAVA桥接模式的东西,DriverType
是一个协议,要求指定属性vehicle
是一个Drivable
对象,Drivable
也是一个协议,由级“轿车”通过
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'
}
当我实现Driver
该类时,将vehicle
property声明为是很自然的Car
。但是后来我遇到了一个问题,即即使完全Driver
符合要求,编译器也认为不符合要求。DriverType
Car
Drivable
更新:
@Antonio的答案很可靠,但这是我目前解决的问题,它与类无关。
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
}
我认为编译器错误会引起误解。DriverType
声明采用它的任何类都必须公开vehicle
具有Drivable
类型的属性,而不是具有采用该Drivable
类型的类类型的属性。
我将通过使用泛型定义DriverType
协议和Car
类来解决此问题:
protocol Drivable {
var speed: Double { get }
init()
}
protocol DriverType {
typealias T: Drivable
var vehicle: T { get }
}
class Car: Drivable {
var speed = 80.0;
var brand = "BMW"
required init() {}
}
class Driver<T: Drivable>: DriverType {
var vehicle: T = T()
}
这明确指出采用类的DriverType
必须公开其vehicle
属性为采用Drivable
协议的任何类的属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句