Swift中如何用泛型类替代多子类的测量传感器实现?
用泛型类替代特定传感器子类的实现方案
要解决这个问题,核心是把原本每个子类里硬编码的测量单位,改成泛型类的实例属性,在初始化时传入具体单位。这样就能用单个泛型类替代所有特定子类,同时支持任意Dimension类型的单位。
完整泛型类实现
import Combine import Foundation public final class MeasurementSensor<T: Dimension>: DoubleSensor { // 存储具体的测量单位实例 private let unit: T public var measurement: Measurement<T> { return Measurement(value: state.value, unit: unit) } // 修改初始化方法,新增单位参数 public init(withSensor sensor: any VEntity, unit: T) { self.unit = unit super.init(withSensor: sensor) } }
使用示例
按照你的需求,创建不同类型传感器的代码可简化为:
// 温度传感器(摄氏度) let temperatureSensor = MeasurementSensor(withSensor: sensor01, unit: UnitTemperature.celsius) // 能量传感器(千瓦时) let energySensor = MeasurementSensor(withSensor: sensor02, unit: UnitEnergy.kilowattHours) // 百分比传感器 let percentageSensor = MeasurementSensor(withSensor: sensor03, unit: UnitPercentage.percentage)
关键说明
- 泛型约束
T: Dimension确保传入的单位必须是Dimension子类(如UnitTemperature、UnitEnergy),完全适配Measurement的类型要求。 - 新增的
unit存储属性保存了具体单位实例,让measurement计算属性可以直接复用该值生成Measurement对象。 - 初始化方法先完成自身属性赋值,再调用父类初始化,符合Swift的初始化安全规则。
改造完成后,你可以直接移除TemperatureSensor、PercentageSensor、EnergySensor三个子类,仅通过MeasurementSensor就能支持所有基于Double值的传感器类型。
内容的提问来源于stack exchange,提问作者Orkysh
相关产品推荐
相关产品推荐

