从协议创建对象时编译器没有触发错误

Compiler didn't fire an error when creating an object from a Protocol

这是我阅读的资源中的代码示例

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是一个协议,是不是像一个抽象的class协议不能实例化一个对象?如果是这样,为什么编译器不给我错误警告?

更新: 如果添加如下代码,会有错误提示

wheeledBike.numberOfWheels = 4

书上没有错,上面一行会引入错误,不是标有***的行

非常感谢您的宝贵时间和帮助

在下面的代码中,您将创建一个 Bike 对象,它具有 var numberOfWheels 属性,var 意味着您可以更改它,这就是为什么您能够更改 numberOfWheels.

的值
var bike: Bike = Bike()
bike.numberOfWheels = 16

下一行是有效的,因为 Bike class 符合协议 WheeledVehicle,因此 bike 可以转换为 wheeledBike。您不是在创建新对象,而只是将其分配给新变量。

var wheeledBike: WheeledVehicle = bike

如果你尝试下面的代码,它会失败,因为 wheeledBikeWheeledVehicle 的类型,它有 var numberOfWheels: Int { **get** },这里 get 意味着根据协议,您只能检索此值,但您不允许 set/change 它。

wheeledBike.numberOfWheels = 16