无法更改对象的协议一致性

时间:2016-06-01 20:14:34

标签: swift protocols

在代码中,WheeledVehicle是协议,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不同,为什么它告诉我无效的重新声明?

问题:我应该如何更改对象的协议一致性?或者是否允许更改对象的一致性?

感谢您的时间和帮助。

3 个答案:

答案 0 :(得分:3)

您可以使用protocol<Vehicle, Wheeled>为其提供VehicleWheeled的类型信息,而不直接使用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符合VehicleWheeled时,您可以将它们写入VehicleWheeled类型的变量。

let bike: Bike = Bike()

let wheeled: Wheeled = bike
let vehikle: Vehicle = bike

但这并不是非常有用,因为您可以在需要BikeVehicle的任何地方使用Wheeled

如果你有一个代码,你期望Wheeled,但稍后检查,如果它也是Vehicle,则表明存在设计问题。