从协议创建对象时编译器没有触发错误
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
如果你尝试下面的代码,它会失败,因为 wheeledBike
是 WheeledVehicle
的类型,它有 var numberOfWheels: Int { **get** }
,这里 get 意味着根据协议,您只能检索此值,但您不允许 set/change 它。
wheeledBike.numberOfWheels = 16
这是我阅读的资源中的代码示例
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
如果你尝试下面的代码,它会失败,因为 wheeledBike
是 WheeledVehicle
的类型,它有 var numberOfWheels: Int { **get** }
,这里 get 意味着根据协议,您只能检索此值,但您不允许 set/change 它。
wheeledBike.numberOfWheels = 16