【发布时间】:2021-10-04 23:32:39
【问题描述】:
一个函数
func stepperValueChanged(_ myStepper: UIStepper) {
// do stuff with myStepper
}
第二个功能
func switchValueChanged(_ mySwitch: UISwitch) {
// do stuff with mySwitch
}
如何创建可以采用任一类型的第三个(替代)函数?
func valueChanged(_ myComponent: /* ??? UIStepper or UISwitch, but nothing else ??? */) {
// do stuff with myComponent
}
我探索过使用枚举、类型别名和协议;这导致了很多有趣的 Stackoverflow 读取,但没有解决方案。
无效的示例
// ** DON'T COPY AND PASTE, DONT WORK!! ** //
typealias validUIComponent = UIStepper, UISwitch
// or
typealias validUIComponent = UIStepper & UISwitch
// or
enum UIComponent { case stepper(UIStepper); case _switch(UISwitch) }
// or
protocol UIComponent { }
extension UIStepper: UIComponent { }
extension UISwitch: UIComponent { }
// ** DON'T COPY AND PASTE, DONT WORK!! ** //
我为什么要这样做?类型检查。我不希望将任何其他 UI 元素传递给该函数。
我意识到如果 let/guard let 或某种其他形式的检查在函数体中一次并根据需要保释,我可以,但这只会捕获运行时而不是编译时类型错误。
我也意识到我可以使用 Any?或(更好的)UIControl 并根据需要向下转换。
func valueChanged(_ myComponent: UIControl) {
// do stuff with
myComponent as! UIStepper
// do stuff with
myComponent as! UISwitch
}
但是有句法/更具表现力的解决方案吗?
【问题讨论】:
标签: ios swift function types typechecking