[英]JSON encode non primitive types in Swift
Helo我想編碼非標准類型,例如sims_float3x3
和[vector_float3]
。 推薦的方法是什么?
我試圖像這樣使用Struct
,
struct Example: Codable {
var test_var1:simd_float3x3
var test_var2:[vector_float3]
}
我收到錯誤, does not conform to protocol 'Decodable'
我也嘗試過
let data = try encoder.encode(test_var1)
我收到錯誤- Argument type 'simd_float3x3' does not conform to expected type 'Encodable'
我目前可以這樣做,
let data_col1 = try encoder.encode(test_var1.columns.0) // simd_float3
let data_col2 = try encoder.encode(test_var1.columns.1) // simd_float3
let data_col3 = try encoder.encode(test_var1.columns.2) // simd_float3
但是,有什么方法可以更優雅/更有效地做到這一點嗎?
您可以對外部數組使用與此答案中所示相同的技術:
import SceneKit
extension simd_float3x3: Codable {
public init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
try self.init(container.decode([float3].self))
}
public func encode(to encoder: Encoder) throws {
var container = encoder.unkeyedContainer()
try container.encode([columns.0, columns.1, columns.2])
}
}
游樂場測試
let simdFloat = simd_float3x3(float3(0, 1, 2), float3(3,4, 5), float3(6, 7, 8))
do {
let data = try JSONEncoder().encode(simdFloat)
let decodedObject = try JSONDecoder().decode(simd_float3x3.self, from: data)
print(decodedObject) // simd_float3x3([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
} catch {
print(error)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.