Swift - 如何更改 JSON 结构元素值

Swift - How to change JSON Struct Element Values

我已经使用 JSONDocode 将 JSON 数据文件转换为 Struct 的 deviceParameters 实例,并且工作正常。但是,之后我很难以编程方式更改 Struct 上的属性值。有什么建议吗?

struct DeviceParameters : Codable, Hashable {
    
    let id : String
    let version : String
    let encoding : String
    let deviceType : String // name of XML file is converted to deviceName, unique identifier
    var Point : [PointData]
    
    enum CodingKeys: String, CodingKey {
        case id, version, encoding, Point
        case deviceType = "name"
    }
}

struct PointData : Codable, Hashable {
    let id : String
    var name : String
    let type : String
    var address : Address
    let calculate : Calculate
    let pointEnum: [String: String]
    var presentValue : String
    
    enum CodingKeys: String, CodingKey {
        case id, name
        case type = "Type"
        case address = "Address"
        case calculate = "Calculate"
        case pointEnum = "Enum"
        case presentValue
    }
    
}

struct Calculate: Codable, Hashable {
    let scaling, decimals, min, max: String?
}

struct Address: Codable, Hashable {
    var index: String
    let type: String
    let format: String
}

使用 ForEach 我可以滚动打印结构参数,但我无法为变量分配新值。正确的方法是什么?也许是最简单的?

func updatePresentValue(pointNo : Int) {
    
    deviceParameters.Point.forEach {
        print([=13=].name) // prints the name of the "Point" OK
        print([=13=].address.index) // prints the name of the "Point.Address" OK
        [=13=].presentValue = "200" // Not working telling [=13=] inmutable
        [=13=].address.index = "20"  // Not working telling [=13=] inmutable
    }
}

首先确保以小写字母开头命名变量,这是公认的编码习惯。

闭包参数是不可变的,不能赋新值。但是您可以使用 map 运算符来复制您的结构,分配新值并 return 在您的闭包中复制该副本。

func updatePresentValue(pointNo : Int) {
    deviceParameters.points = deviceParameters.points.map { point in
        var p = point
        p.address.index = "New value"
        return p
    }
}