Swift 创建从多个协议继承的协议类型的对象时出错
在以下代码中,有3个协议: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
轮式
、车辆
和轮式车辆
(继承自轮式
和车辆
)
问题:几乎是错误本身,我不明白,为什么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,我不知道这一点。