
1 hstdt 2022-11-04 12:42:29 +08:00 via iPhone 遇到第二个问题的场景,我会用这个库来解 https://github.com/SwiftyJSON/SwiftyJSON 同时也满足 1 里面你想要的使用习惯 |
2 pocarisweat 2022-11-04 13:17:41 +08:00 |
3 xtinput 2022-11-04 13:22:34 +08:00 codable 可以自定义字段的呀 |
4 usVexMownCzar 2022-11-04 13:29:59 +08:00 上第三方库吧 以前觉得 codable 牛逼,后来跟后端 API 对接的时候把我干懵了,一个 status_code 两种状态类型,Int 是一个状态,string 是另一种状态 推荐 SwiftyJSON |
5 cssk 2022-11-04 13:34:25 +08:00 via iPhone 如果数据量不大,不在乎效率,那就上 swiftyjson 吧 |
6 BeyondBouds OP @hstdt @ocarisweat @xtinput @chiaf @cssk 非常感谢各位的回复。 因为不知道其他端的字段 嵌套层级是怎么样的,里面有什么字段,字段的值又是类型的...所以没法介入 codable 的过程... 由于已经开发了大部分了,感觉换 swiftJson 成本有点高,我先找找其他解决办法吧... |
7 foxwe10 2022-11-07 01:08:25 +08:00 1. 针对后端返回的数据,不太确定你的需求是什么样子。假如返回的数据中你需要的字段是 json 数据结构对应的子集,可以定义实现 Decodable 协议的 struct/class 只有你需要的字段作为 Codingkey ,不需要转换为 json 再转换为 Data 2. SwiftyJson 是支持 Codable 的,如果觉得性能有问题,他的 repo 中有一个优化过的 pr ,可以参考,本身 SwiftyJson 只有一个文件,比较好处理。 |
8 foxwe10 2022-11-07 01:11:38 +08:00 @chiaf 这种 Codable 也可以解决, 但实际上是后端的问题 ```swift public enum EitherOr<T, V>: Codable where T: Codable, V: Codable { case either(T) case or(V) public init(from decoder: Decoder) throws { let cOntainer= try decoder.singleValueContainer() if let value = try? container.decode(T.self) { self = .either(value) } else if let value = try? container.decode(V.self) { self = .or(value) } else { throw DecodeError.unkownType } } public func encode(to encoder: Encoder) throws { var cOntainer= encoder.singleValueContainer() switch self { case let .or(value): try container.encode(value) case let .either(value): try container.encode(value) } } public var either: T? { switch self { case let .either(v): return v default: return nil } } public enum DecodeError: Error { case unkownType } } ``` |