在代码中,Wheeled
和Vehicle
是协议,Bike
类符合两种协议
protocol Wheeled {
var numberOfWheels: Int { get }
}
protocol Vehicle {
var maker: String { get }
var owner: String {get set}
var ownerKid: String { get }
}
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()
var theBike: Vehicle = bike // #1
var theBike: Wheeled = bike // #2 error: invalid redeclaration of 'theBike'
当我检查theBike
的属性时,在#1中,theBike
对象只有属性符合Vehicle
协议;而在#2 theBike
对象中,只有属性符合Wheeled
属性
因此,我觉得#1和#2中的theBike
不同,为什么它告诉我无效的重新声明?
问题:我应该如何更改对象的协议一致性?或者是否允许更改对象的一致性?
感谢您的时间和帮助。
答案 0 :(得分:3)
您可以使用protocol<Vehicle, Wheeled>
为其提供Vehicle
和Wheeled
的类型信息,而不直接使用Bike
类型。
let theBike: protocol<Vehicle, Wheeled> = bike
print(theBike.numberOfWheels) // 0
print(theBike.owner) // Bob
答案 1 :(得分:2)
if let ... as? ...
重新制作。示例:
if let theBike = theBike as? Wheeled {
print(theBike.numberOfWheels)
}
答案 2 :(得分:1)
当Bike符合Vehicle
和Wheeled
时,您可以将它们写入Vehicle
和Wheeled
类型的变量。
let bike: Bike = Bike()
let wheeled: Wheeled = bike
let vehikle: Vehicle = bike
但这并不是非常有用,因为您可以在需要Bike
或Vehicle
的任何地方使用Wheeled
。
如果你有一个代码,你期望Wheeled
,但稍后检查,如果它也是Vehicle
,则表明存在设计问题。