ios - JSON 在 Swift 中编码非原始类型

标签 ios json swift encode

Helo 我想对非标准类型进行编码,例如 sims_float3x3[vector_float3]。推荐的方法是什么?

我试过像这样使用Struct

struct Example: Codable {
    var test_var1:simd_float3x3
    var test_var2:[vector_float3]
}

我收到错误消息,不符合“可解码”协议(protocol)

我也试过了,

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

但是有什么方法可以更优雅/更有效地做到这一点吗?

最佳答案

您可以使用与此 answer 中所示相同的技术对于外部数组:

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])
     }
 }

Playground 测试

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)
}

关于ios - JSON 在 Swift 中编码非原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55731895/

相关文章:

iphone - 使用 Kal 日历

javascript - 如何在 Phonegap/Cordova(iOS 和 Android)的谷歌地图中获得后退按钮

arrays - 在字典的数组中加载带有字典的 JSON 文件

iPhone 的 CSS3 菜单兼容性

ios - 如何在 iPhone 的 xamarin 中捕获带有弹出窗口的屏幕截图?

Javascript 数据格式,这是 JSON 吗?

java - 我有一个 JSON 响应,但我一直坚持使用它

ios - 快速条件函数返回

ios - 在完成之前调用 Dispatch.main.asyncAfter() 会导致应用程序崩溃

ios - 将 UIView 转换为 SKView 时的程序集崩溃报告