You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:21:00