swift - Swift 中重写方法或属性时的多态性

标签 swift

我想通过编译器确保 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/

相关文章:

swift - 为什么 Swift Playgrounds 不显示 View 的转换?

swift - 如何通过引用将 UnsafePointer<UInt8> 传递给 C API?

ios - SideMenu Jonkykong sideMenuDidAppear 和 sideMenuDidDisappear 委托(delegate)未触发

ios - SQLite 与核心数据 : saving large amounts of data

xcode - Swift项目快速使用MASShortcut框架

ios - 对在 iOS 中绘制原点感到困惑

swift - "use of unresolved identifier"环球银行金融电信协会

ios - 使用 Codable 解析嵌套的非键控 JSON

ios - 使用未解析的标识符 'jpegData'

swift - 在 SwiftUI 中延迟重复动画,并在完全自动反向重复循环之间