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
}
}
我已经使用 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
}
}