在 Swift5 中将一些属性值从一个类复制到另一个类实例

问题描述 投票:0回答:1

我正在快速编写一个应用程序,连接并存储对蓝牙设备的引用。该蓝牙设备物理连接到传感器(例如紫外线传感器、温度传感器等)并将传感器的读数传输到应用程序。

我有一个名为 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
}

我不喜欢这个想法,因为在我看来它的扩展性不太好,如果我或未来的开发人员向这个传感器类添加新属性,他们还必须记住将其添加到这个方法中。我也尝试过考虑反射,因为这似乎是最有前途的方法,但在接近实现我想要的目标方面没有取得太大成功。

ios swift class reflection
1个回答
0
投票

您已经在此处创建了两组属性,以及您的注释和空白的使用:

`` 公共类传感器{ // 我不想复制到新类实例的属性 公共外设: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
}
© www.soinside.com 2019 - 2024. All rights reserved.