Swift 创建从多个协议继承的协议类型的对象时出错

Swift 创建从多个协议继承的协议类型的对象时出错,swift,swift-protocols,Swift,Swift Protocols,在以下代码中,有3个协议:轮式、车辆和轮式车辆(继承自轮式和车辆) 问题:几乎是错误本身,我不明白,为什么Bike类型的值不符合指定类型轮式车辆 protocol Wheeled { var numberOfWheels: Int { get } } protocol Vehicle { var maker: String { get } var owner: String {get set} var ownerKid: String { get } } pr

在以下代码中,有3个协议:
轮式
车辆
轮式车辆
(继承自
轮式
车辆

问题:几乎是错误本身,我不明白,为什么
Bike
类型的值不符合指定类型
轮式车辆

protocol Wheeled {
    var numberOfWheels: Int { get }
}

protocol Vehicle {
    var maker: String { get }
    var owner: String {get set}
    var ownerKid: String { get }
}

protocol WheeledVehicle: Wheeled, Vehicle {
  // simply just combine Wheeled and Vehicle
}

class Bike: Vehicle, Wheeled {
let numberOfWheels: Int = 0
var ownerKid: String = "Junior"

var maker: String {
    return "Ford"
}

var owner: String {
    get {
        return "Bob"
        }
        set {
            ownerKid = "\(newValue) Junior"
        }
    }
}


let bike: Bike = Bike()

let wheeledVehicleBike: WheeledVehicle = bike //error: value of type 'Bike' does not conform to specified type 'WheeledVehicle'

非常感谢您的时间和帮助。

编译器并不认为“有轮子”和“是一辆车”意味着“是一辆有轮子的车”。您的
轮式车辆可能会增加新的要求

目前,编译器不进行这种检查。老实说,这不应该,因为这会带来很多不明确、含蓄的行为,而没有什么好处


您必须明确地将
自行车
改为
轮式车辆

基本上:,因为它与之不符

要让编译器知道
自行车
符合
轮式车辆
,您必须指定它。编译器不会只是假设,由于两者都符合相同的协议,因此可以将它们分配给彼此

与以下方法不起作用的方式相同

class A { var a : String = "" }
class B { var a : String = "" }

var a : A = A()
var b : B = a // cannot convert value of type 'A' to specified type 'B'
甚至更简单

class A {  }
class B {  }

var a : A = A()
var b : B = a // cannot convert value of type 'A' to specified type 'B'
编译器不关心这两种类型是否相似-它们必须相似

如果您的
轮式车辆
添加了
func
,您的示例中会发生什么?
自行车
不再符合它了吗


使
自行车
符合
轮式车辆
的唯一方法是明确声明:
自行车:轮式车辆

继承只在一个方向上起作用。例如,如果
Cat
继承自
Animal
,则
Cat
的实例就是
Animal
的实例。但是
Animal
的实例不一定是
Cat

类似地,在您的示例中,
轮式车辆
的实例既是
轮式车辆
的实例,也是
车辆
的实例。但同时是
轮式
车辆
实例的东西不一定是
轮式车辆
的实例

另一个注意事项:您可能会发现在代码中使用此符号很方便:

let wheeledVehicleBike: protocol<Wheeled, Vehicle> = bike
let-wheeled车辆类:协议=自行车

这允许您指定一个类型所符合的多个协议,而无需为此定义其他协议。

@AMonchilov感谢您的解释。因此,为了消除错误,只需让自行车继承车轮车辆,是的,我忘了添加该部件。现在就编辑。@AMonhilov再次非常感谢,非常感谢你们的同事:)非常感谢你们的例子和解释。回答得很好!我现在明白多了谢谢你的提示!还有非常生动的解释。
协议
+1,我不知道这一点。