我正在写一个应用程序在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 的开发人员向这个传感器类添加一个新的属性,他们也必须记住将它添加到这个方法中.我也试过看反射,因为这似乎是最有希望的方法,但没有取得太大成功,接近实现我想要的.

推荐答案

您已经在这里创建了两组属性,并使用了您的注释和空白:

public class Sensor {
    // Properties I don’t want copied over to new class instance
    public let peripheral: CBPeripheral    
    // ... group 1

    // Properties I do want copied over to new class instance
    var bluetoothDeviceSerialNumber: String 
    // ... group 2

像这样的分组是尖叫着想要出来的 struct .你可以试着这样做:

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
}

Ios相关问答推荐

Flutter应用程序无法使用IOS/Swift的蓝牙核心库发现某些外围设备

Flutter WebRTC:GetUserMedia()不适用于Safari和IOS设备

iPhone:iOS 17.4中没有气压数据

CIKernel的Metal Shader裁剪问题

发生错误.请稍后重试.在 App Store 连接中

Swift Combine和iOS版本限制?

Xcode 不支持 iOS 15.6

有没有办法访问自动生成的 Codable 一致性的编码键?

如何在Collection 后更改并保留按钮 colored颜色 ,然后在 SwiftUI 中切换回来?

SwiftUI 中的偏移量和按钮有问题吗?

如何在 SwiftUI 的列表中使用带有 swipeActions 的 NavigationLink

如何使用 Swift 文档注释

在 Swift 中为 UITextField/UIView 摇动动画

Xcode - 错误 ITMS-90635 - Bundle 包中的 Mach-O 无效 - 提交到 App Store

iOS 10 错误:UICollectionView 接收到具有不存在索引路径的单元格的布局属性

如何在react 导航中获取当前路由名称?

aps-environment 始终在发展

如何用 CAShapeLayer 和 UIBezierPath 画一个光滑的圆?

在 UITableViewController 中使用 UISearchDisplayController 时断言失败

NSURL 到带有 XCTest 的测试包中的文件路径