我正在写一个应用程序在swift的连接和存储引用蓝牙设备.该蓝牙设备物理连接到传感器(例如,UV传感器、温度传感器等)并将传感器的读数传输到应用程序.
我有一个名为Sensor的类,对于可以插入蓝牙设备的每种类型的传感器,它都有几个子类.由于用户可以将不同的传感器拔出并插入到该蓝牙设备,因此我根据传感器类型创建了我的子类的一个新实例,并用这个新的传感器类实例替换了旧的传感器类实例.然而,我还没有找到一个好的方法来复制一些仍然适用于新传感器的相关属性(我不想复制所有的属性,因为其中一些属性是专门根据类进行设置的,而其他属性将继续进行,无论哪个传感器插入蓝牙设备).
public class Sensor {
// Properties I don’t want copied over to new class instance
public let peripheral: CBPeripheral
var sensorID: Int
var sensorImage: UIImage
var modelName: String
var sensorType: String
// Properties I do want copied over to new class instance
var bluetoothDeviceSerialNumber: String
var hardwareVersion: String
var firmwareVersion: String
var softwareVersion: String
var alias: String
var lastConnectedDate: Date
var exampleProperty1: Int
var exampleProperty2: Int
var exampleProperty3: Int
var exampleProperty4: Bool
var exampleProperty5: Bool
required public init(withPeripheral peripheral: CBPeripheral) {
self.peripheral = peripheral
}
}
class UV_Sensor: Sensor {
required public init(withPeripheral peripheral: CBPeripheral){
super.init(withPeripheral: peripheral)
var sensorID = 1
var sensorImage = UIImage(named: “UV_Sensor”)
var modelName = “UVSensorModelName”
var sensorType = “UV”
}
}
Class TemperatureSensor: Sensor {
required public init(withPeripheral peripheral: CBPeripheral){
super.init(withPeripheral: peripheral)
var sensorID = 2
var sensorImage = UIImage(named: “Temp_Sensor”)
var modelName = “TemperatureSensorModelName”
var sensorType = “Temp”
}
}
我目前的解决方案是有一个方法,手动复制我想要的变量.
func copyPropertyValues(from oldSensor: Sensor) {
self.bluetoothDeviceSerialNumber = oldSensor.bluetoothDeviceSerialNumber
self.hardwareVersion = oldSensor.hardwareVersion
self.firmwareVersion = oldSensor.firmwareVersion
self.softwareVersion = oldSensor.softwareVersion
self.alias = oldSensor.alias
self.lastConnectedDate = oldSensor.lastConnectedDate
self.exampleProperty1 = oldSensor.exampleProperty1
self.exampleProperty2 = oldSensor.exampleProperty2
self.exampleProperty3 = oldSensor.exampleProperty3
self.exampleProperty4 = oldSensor.exampleProperty4
self.exampleProperty5 = oldSensor.exampleProperty5
}
我不喜欢这个 idea ,因为在我看来,它的伸缩性不是很好,如果我或某个future 的开发人员向这个传感器类添加一个新的属性,他们也必须记住将它添加到这个方法中.我也试过看反射,因为这似乎是最有希望的方法,但没有取得太大成功,接近实现我想要的.