无法使用具体子类在 Swift 中实现协议中的属性

2023-12-01

我正在做类似于JAVA中的桥接模式的事情,DriverType是一个协议需要一个名为vehicle成为一个Drivable目的,Drivable也是一个协议,被“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'
}

当我实施Driver类,很自然地声明vehicle财产作为Car。但后来我遇到了编译器认为的问题Driver不符合DriverType虽然Car符合Drivable完美。

UPDATE:

@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 type.

我将通过定义两个来解决这个问题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协议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用具体子类在 Swift 中实现协议中的属性 的相关文章

随机推荐