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

钟ride

我在做类似于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该类时,将vehicleproperty声明为是很自然Car但是后来我遇到了一个问题,即即使完全Driver符合要求,编译器也认为符合要求DriverTypeCarDrivable

更新:

@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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

在Swift中基于协议返回具体类型

来自分类Dev

在元类型数组中实现其协议扩展默认值的具体类型的属性覆盖

来自分类Dev

如何使用Matlab的abstract属性并在具体的子类中声明其类型

来自分类Dev

在Swift中实现Objective C协议

来自分类Dev

懒/内联在Swift中实现协议

来自分类Dev

Xcode中的自动实现Swift协议方法

来自分类Dev

在基类中实现Swift协议方法

来自分类Dev

在Swift中实现闭包协议

来自分类Dev

在 Swift 中实现 Objective-C 协议

来自分类Dev

NSManagedObject子类的Swift链接器错误,该子类使用必需的init实现协议

来自分类Dev

Swift-如何覆盖具体子类中的扩展方法

来自分类Dev

Swift 协议扩展默认实现与类中的实际实现

来自分类Dev

在Swift属性中要求协议和类

来自分类Dev

协议扩展中的Swift属性观察器?

来自分类Dev

使类型的属性也符合Swift中的协议

来自分类Dev

Swift协议中的静态类型属性

来自分类Dev

先进的Swift2-V类中的实现协议与Struct中的实现协议

来自分类Dev

NSManagedObject无法符合Swift中的协议

来自分类Dev

无法在Swift中符合MKAnnotation协议

来自分类Dev

在Swift中实现协议中定义的下标时出错

来自分类Dev

无法在 CoreData 子类中创建新属性?iOS8 Swift3

来自分类Dev

检查是否在Swift中实现了可选的协议方法?

来自分类Dev

NSManagedObject在Swift中实现协议的EXC_BAD_ACCESS错误

来自分类Dev

NSManagedObject在Swift中实现协议的EXC_BAD_ACCESS错误

来自分类Dev

Swift中协议扩展的默认实现不起作用

来自分类Dev

在Java中实现具体的类?

来自分类Dev

在Java中实现具体的类?

来自分类Dev

使用具体的类或液体的类作为属性

Related 相关文章

  1. 1

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

  2. 2

    在Swift中基于协议返回具体类型

  3. 3

    在元类型数组中实现其协议扩展默认值的具体类型的属性覆盖

  4. 4

    如何使用Matlab的abstract属性并在具体的子类中声明其类型

  5. 5

    在Swift中实现Objective C协议

  6. 6

    懒/内联在Swift中实现协议

  7. 7

    Xcode中的自动实现Swift协议方法

  8. 8

    在基类中实现Swift协议方法

  9. 9

    在Swift中实现闭包协议

  10. 10

    在 Swift 中实现 Objective-C 协议

  11. 11

    NSManagedObject子类的Swift链接器错误,该子类使用必需的init实现协议

  12. 12

    Swift-如何覆盖具体子类中的扩展方法

  13. 13

    Swift 协议扩展默认实现与类中的实际实现

  14. 14

    在Swift属性中要求协议和类

  15. 15

    协议扩展中的Swift属性观察器?

  16. 16

    使类型的属性也符合Swift中的协议

  17. 17

    Swift协议中的静态类型属性

  18. 18

    先进的Swift2-V类中的实现协议与Struct中的实现协议

  19. 19

    NSManagedObject无法符合Swift中的协议

  20. 20

    无法在Swift中符合MKAnnotation协议

  21. 21

    在Swift中实现协议中定义的下标时出错

  22. 22

    无法在 CoreData 子类中创建新属性?iOS8 Swift3

  23. 23

    检查是否在Swift中实现了可选的协议方法?

  24. 24

    NSManagedObject在Swift中实现协议的EXC_BAD_ACCESS错误

  25. 25

    NSManagedObject在Swift中实现协议的EXC_BAD_ACCESS错误

  26. 26

    Swift中协议扩展的默认实现不起作用

  27. 27

    在Java中实现具体的类?

  28. 28

    在Java中实现具体的类?

  29. 29

    使用具体的类或液体的类作为属性

热门标签

归档