【问题标题】:JSON encode non primitive types in SwiftJSON 在 Swift 中编码非原始类型
【发布时间】:2019-09-07 22:57:52
【问题描述】:

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

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

【问题讨论】:

    标签: ios json swift encode


    【解决方案1】:

    对于外部数组,您可以使用与 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])
         }
     }
    

    游乐场测试

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2011-02-05
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多