从协议创建对象时,编译器未触发错误

时间:2016-06-01 15:43:18

标签: swift protocols

以下是我正在阅读的资源中的代码示例

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

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

非常感谢你的时间和帮助

1 个答案:

答案 0 :(得分:1)

在以下代码中,您创建的Bike对象具有var numberOfWheels属性,var表示您可以更改它,这就是为什么您可以更改{{1}的值1}}。

numberOfWheels

以下行有效,因为var bike: Bike = Bike() bike.numberOfWheels = 16 类符合协议Bike,因此WheeledVehicle可以投放为bike。您不是在创建新对象,而只是将其分配给新变量。

wheeledBike

如果您尝试使用代码,则会失败,因为var wheeledBike: WheeledVehicle = bike 的类型为wheeledBikeWheeledVehicle,此处获取表示按协议,您只能检索此值,但您允许设置/更改它。

var numberOfWheels: Int { **get** }