我想通过编译器确保 CarViewController
仅接收车辆属性中的 Car
。
给出以下 swift 示例代码:
class Vehicle {
func doSomething(){}
}
class Car: Vehicle {
func doCarThings(){}
}
class VehicleViewController : UIViewController {
var vehicle : Vehicle!;
override func viewDidLoad() {
super.viewDidLoad();
vehicle.doSomething();
}
}
class CarViewController:VehicleViewController {
var vehicle: Car!
override func viewDidLoad() {
super.viewDidLoad();
vehicle.doCarThings();
}
}
我收到以下错误:无法覆盖“车辆!”类型的可变属性“车辆”协变类型“Car!”
我尝试使用基于泛型的方法:
class Vehicle {
func doSomething(){}
}
class Car: Vehicle {
func doCarThings(){}
}
class VehicleViewController<T:Vehicle> : UIViewController {
var vehicle : T!;
override func viewDidLoad() {
super.viewDidLoad();
vehicle.doSomething();
}
}
class CarViewController:VehicleViewController<Car> {
override func viewDidLoad() {
super.viewDidLoad();
vehicle.doCarThings();
}
}
这是正确的,但在 Storyboard类中使用泛型会导致错误(因为它们被编译为 Objective-C)。
如何在不使用泛型的情况下做到这一点?
谢谢!
最佳答案
我真的不确定这里的设计,但是要完成你想要的事情,你可以这样做:
class CarViewController: VehicleViewController {
var vehicleAsCar: Car { return self.vehicle as! Car }
override func viewDidLoad() {
super.viewDidLoad();
vehicleAsCar.doCarThings();
}
}
但这看起来很臭。更安全的夜晚:
class CarViewController: VehicleViewController {
override var vehicle: Vehicle! {
didSet {
assert(vehicle is Car, "Attempt to set vehicle to non-Car")
}
}
var vehicleAsCar: Car { return self.vehicle as! Car }
override func viewDidLoad() {
super.viewDidLoad();
vehicleAsCar.doCarThings();
}
}
关于swift - Swift 中重写方法或属性时的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43937762/