我正在快速编写一个应用程序,连接并存储对蓝牙设备的引用。该蓝牙设备物理连接到传感器(例如紫外线传感器、温度传感器等)并将传感器的读数传输到应用程序。
我有一个名为 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
}
我不喜欢这个想法,因为在我看来它的扩展性不太好,如果我或未来的开发人员向这个传感器类添加新属性,他们还必须记住将其添加到这个方法中。我也尝试过考虑反射,因为这似乎是最有前途的方法,但在接近实现我想要的目标方面没有取得太大成功。
您已经在此处创建了两组属性,以及您的注释和空白的使用:
``
公共类传感器{
// 我不想复制到新类实例的属性
公共外设:CBPeripheral
// ... 第 1 组
// Properties I do want copied over to new class instance
var bluetoothDeviceSerialNumber: String
// ... group 2
Groupings like this are structs screaming to get out. You might try something like this:
```swift
public class Sensor {
struct SensorDetails {
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
}
// 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 sensorDeatils: SensorDetails
required public init(withPeripheral peripheral: CBPeripheral) {
self.peripheral = peripheral
}
}
现在你的
copyPropertyValues
函数变得微不足道:
func copyPropertyValues(from oldSensor: Sensor) {
self.sensorDetails = oldSensor.sensorDetails
}