在下面的代码中,有3个协议(protocol):Wheeled
、Vehicle
和WheeledVehicle
(继承自Wheeled
和车辆
)
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'
问题:几乎是错误本身,我不明白,为什么类型 Bike
的值不符合指定类型 WheeledVehicle
非常感谢您的时间和帮助。
最佳答案
基本上:因为不符合
要让编译器知道 Bike
符合 WheeledVehicle
,您必须指定它。编译器不会只是假定,因为它们都遵循相同的协议(protocol),所以它们可以相互赋值。
同理下面的不行。
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'
编译器不关心这两种类型看起来是否相似 - 它们必须相似。
如果您的 WheeledVehicle
添加了一个 func
,您的示例中会发生什么情况? Bike
是否不再符合它?
使 Bike
符合 WheeledVehicle
的唯一方法是显式声明它:class Bike : WheeledVehicle
!
关于swift - 创建从多个协议(protocol)继承的协议(protocol)类型的对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37576780/