如何在可编码结构 (swift) 中使用计算 属性
How to use computed property in a codable struct (swift)
我创建了一个 "codable" 结构来序列化数据集并将其编码为 Json。除了计算属性未显示在 json 字符串中外,一切都运行良好。如何在编码阶段包含计算属性。
例如:
struct SolidObject:Codable{
var height:Double = 0
var width:Double = 0
var length:Double = 0
var volume:Double {
get{
return height * width * length
}
}
}
var solidObject = SolidObject()
solidObject.height = 10.2
solidObject.width = 7.3
solidObject.length = 5.0
let jsonEncoder = JSONEncoder()
do {
let jsonData = try jsonEncoder.encode(solidObject)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString)
} catch {
print(error)
}
打印出“{"width":7.2999999999999998,"length":5,"height":10.199999999999999}”
我也很好奇有 7.29999.. 而不是 7.3 但我的主要问题是 "how can I include "volume" to this json string too"?
您需要手动 encode/decode 而不是让自动化的东西为您做。这在 Swift 游乐场中按预期工作。
struct SolidObject: Codable {
var height:Double = 0
var width:Double = 0
var length:Double = 0
var volume:Double {
get{
return height * width * length
}
}
enum CodingKeys: String, CodingKey {
case height
case width
case length
case volume
}
init() { }
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
height = try values.decode(Double.self, forKey: .height)
width = try values.decode(Double.self, forKey: .width)
length = try values.decode(Double.self, forKey: .length)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(height, forKey: .height)
try container.encode(width, forKey: .width)
try container.encode(length, forKey: .length)
try container.encode(volume, forKey: .volume)
}
}
var solidObject = SolidObject()
solidObject.height = 10.2
solidObject.width = 7.3
solidObject.length = 5.0
let jsonEncoder = JSONEncoder()
do {
let jsonData = try jsonEncoder.encode(solidObject)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString)
} catch {
print(error)
}
我创建了一个 "codable" 结构来序列化数据集并将其编码为 Json。除了计算属性未显示在 json 字符串中外,一切都运行良好。如何在编码阶段包含计算属性。
例如:
struct SolidObject:Codable{
var height:Double = 0
var width:Double = 0
var length:Double = 0
var volume:Double {
get{
return height * width * length
}
}
}
var solidObject = SolidObject()
solidObject.height = 10.2
solidObject.width = 7.3
solidObject.length = 5.0
let jsonEncoder = JSONEncoder()
do {
let jsonData = try jsonEncoder.encode(solidObject)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString)
} catch {
print(error)
}
打印出“{"width":7.2999999999999998,"length":5,"height":10.199999999999999}”
我也很好奇有 7.29999.. 而不是 7.3 但我的主要问题是 "how can I include "volume" to this json string too"?
您需要手动 encode/decode 而不是让自动化的东西为您做。这在 Swift 游乐场中按预期工作。
struct SolidObject: Codable {
var height:Double = 0
var width:Double = 0
var length:Double = 0
var volume:Double {
get{
return height * width * length
}
}
enum CodingKeys: String, CodingKey {
case height
case width
case length
case volume
}
init() { }
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
height = try values.decode(Double.self, forKey: .height)
width = try values.decode(Double.self, forKey: .width)
length = try values.decode(Double.self, forKey: .length)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(height, forKey: .height)
try container.encode(width, forKey: .width)
try container.encode(length, forKey: .length)
try container.encode(volume, forKey: .volume)
}
}
var solidObject = SolidObject()
solidObject.height = 10.2
solidObject.width = 7.3
solidObject.length = 5.0
let jsonEncoder = JSONEncoder()
do {
let jsonData = try jsonEncoder.encode(solidObject)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString)
} catch {
print(error)
}