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
chiaf 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
@pocarisweat @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 } } ``` |