以下是我正在阅读的资源中的代码示例
protocol Vehicle {
var weight: Int { get }
var name: String { get set }
}
protocol WheeledVehicle: Vehicle {
var numberOfWheels: Int { get }
var wheelSize: Double { get set }
}
class Bike: WheeledVehicle{
var weight: Int = 30
var name: String = "kukulus"
var numberOfWheels: Int = 2
var wheelSize: Double = 16.2}
var bike: Bike = Bike()
bike.numberOfWheels = 16
var wheeledBike: WheeledVehicle = bike // *** There will be an error, in fact not.
最后一行(标有***)
问题1 我读过的这本书声称这将是编译器发出的错误“ 无法分配给numberOfWheels! ”,然而,事实并非如此。这本书错了吗?
问题2 var wheeledBike: WheeledVehicle = bike
其中WheeledVehicle
是一个协议,它不是一个协议无法实例化对象的抽象类吗?如果是这样,为什么编译器没有给我一个错误警告?
更新: 如果添加以下代码,则会出现错误通知
wheeledBike.numberOfWheels = 4
本书没有错,上面的行会引入错误,而不是标有***的行
非常感谢你的时间和帮助
答案 0 :(得分:1)
在以下代码中,您创建的Bike
对象具有var numberOfWheels
属性,var
表示您可以更改它,这就是为什么您可以更改{{1}的值1}}。
numberOfWheels
以下行有效,因为var bike: Bike = Bike()
bike.numberOfWheels = 16
类符合协议Bike
,因此WheeledVehicle
可以投放为bike
。您不是在创建新对象,而只是将其分配给新变量。
wheeledBike
如果您尝试使用代码,则会失败,因为var wheeledBike: WheeledVehicle = bike
的类型为wheeledBike
且WheeledVehicle
,此处获取表示按协议,您只能检索此值,但您不允许设置/更改它。
var numberOfWheels: Int { **get** }