ios - JSON 在 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)
}
推荐阅读
- java - 无限物品recyclerview练习
- android - 如何将数组中的所有值添加到 ArrayList?
- c++ - 我们可以声明一个抽象方法来返回抽象超类中的子类对象而不需要新的实例化吗?
- c++ - 在这种情况下,数组 a 会被取消分配吗?
- python - 如何解决使用 fmin_l_bfgs_b 后出现的“未能初始化意图(inout|inplace|cache)数组,输入不是数组”?
- flutter - 如何分享一个用 Dart 编写的闭源 Flutter 库?
- python - 在 Python 中仅获取列表的某些值
- c++ - C++20 标准::原子
- 标准::原子 .specializations - python - Python中最接近的素数
- google-cloud-platform - Cloud SQL 副本在重启/故障转移或实例增加时会发生什么情况