Skip to content

Commit a593427

Browse files
committed
更新readme
1 parent f16be0d commit a593427

8 files changed

Lines changed: 343 additions & 1114 deletions

File tree

Document/README/CompareWithHandyJSON.md

Lines changed: 342 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
# SmartCodable - Compare With HandyJSON
1+
2+
3+
# 使用SmartCodable 平替 HandyJSON
4+
5+
6+
7+
## SmartCodable VS HandyJSON
28

39
| 序号 | 🎯 特性 | 💬 特性说明 💬 | SmartCodable | HandyJSON |
410
| ---- | ----------------------------- | ------------------------------------------------------------ | ------------ | --------- |
@@ -12,7 +18,7 @@
1218
| 8 | **属性的自定义解析** - 重命名 | 自定义解码key(对解码的Model属性重命名) |||
1319
| 9 | **属性的自定义解析** - 忽略 | 忽略某个Model属性的解码 |||
1420
| 10 | **支持designatedPath** | 实现自定义解析路径 |||
15-
| 11 | **Model的继承** | 在model的继承关系下,Codable的支持力度较弱,使用不便(可以支持) | ||
21+
| 11 | **Model的继承** | 使用`@SmartSubclass` 修饰SubModel | ||
1622
| 12 | **自定义解析路径** | 指定从json的层级开始解析 |||
1723
| 13 | **超复杂的数据解码** | 解码过程中,多数据做进一步的整合/处理。如: 数据的扁平化处理 || ⚠️ |
1824
| 14 | **解码性能** | 在解码性能上,SmartCodable 平均强 30% || ⚠️ |
@@ -30,9 +36,7 @@
3036

3137

3238

33-
## 使用SmartCodable 平替 HandyJSON
34-
35-
更多内容请查看: [替换指导](https://github.com/intsig171/SmartCodable/blob/develop/Document/Suggest/suggest4.md)
39+
## 平替说明
3640

3741
| 内容项 | 内容项说明 | 使用场景 | 替换难度 | 评判理由 |
3842
| --------------- | --------------------------------------------- | -------- | -------- | ------------------------------------------------------ |
@@ -45,3 +49,336 @@
4549
| ⑦处理继承关系 | 解析存在的继承关系的Model | ★☆☆☆☆ | ★★★★★ | 建议使用协议实现。 |
4650
| ⑧枚举的解析 | 解析枚举属性 | ★☆☆☆☆ | ★☆☆☆☆ | 多实现一个 defaultCase |
4751

52+
53+
54+
## 平替指导
55+
56+
### 1. 声明Model
57+
58+
除了遵守的协议不同外,其他一样。你只需要做一件事,将 **HandyJSON** 替换为 **SmartCodable**
59+
60+
#### HandyJSON
61+
62+
```
63+
import HandyJSON
64+
```
65+
66+
* class类型的Model
67+
68+
```
69+
class HandyModel: HandyJSON {
70+
var name: String = ""
71+
required init() { }
72+
}
73+
```
74+
75+
* struct类型的Model
76+
77+
```
78+
struct HandyModel: HandyJSON {
79+
var name: String = ""
80+
}
81+
```
82+
83+
84+
85+
#### SmartCodable
86+
87+
```
88+
import SmartCodable
89+
```
90+
91+
* class类型的Model
92+
93+
```
94+
class SmartModel: SmartCodable {
95+
var name: String = ""
96+
required init() { }
97+
}
98+
```
99+
100+
* struct类型的Model
101+
102+
```
103+
struct SmartModel: SmartCodable {
104+
var name: String = ""
105+
}
106+
```
107+
108+
109+
110+
### 2. 反序列化
111+
112+
在反序列化中,可以 **完全无障碍的平替**,不需要代码改动。
113+
114+
> 注意:使用HandyJSON解码数组时候,需要使用 as? [HandyModel] 进行可选解包。SmartCodable中是不需要的,当然不删除也不会报错。
115+
>
116+
> 你可以全局搜索 **) as? [** ,查找删除。
117+
118+
#### HandyJSON
119+
120+
解析字典数据和数组数据
121+
122+
```
123+
guard let handyModel = HandyModel.deserialize(from: dict) else { return }
124+
125+
guard let handyModels = [HandyModel].deserialize(from: [dict]) as? [HandyModel] else { return }
126+
```
127+
128+
#### SmartCodable
129+
130+
解析字典数据和数组数据
131+
132+
```
133+
guard let smartModel = SmartModel.deserialize(from: dict) else { return }
134+
135+
guard let smartModels = [SmartModel].deserialize(from: [dict]) else { return }
136+
```
137+
138+
139+
140+
### 3. 序列化
141+
142+
在序列化中,需要少量的代码改动。需要将 `toJSON()` 替换为 `toDictionary()``toArray()`
143+
144+
序列化的使用场景较少,应该影响不大。
145+
146+
#### HandyJSON
147+
148+
* 将模型序列化字典或json字符串
149+
150+
```
151+
let toDict = handyModel.toJSON()
152+
let toJsonStr = handyModel.toJSONString()
153+
```
154+
155+
* 将模型序列化数组或json字符串
156+
157+
```
158+
let toArr = handyModels.toJSON()
159+
let toArrStr = handyModels.toJSONString()
160+
```
161+
162+
#### SmartCodable
163+
164+
* 将模型序列化字典或json字符串
165+
166+
```
167+
let toDict1 = smartModel.toDictionary()
168+
let toJsonStr1 = smartModel.toJSONString()
169+
```
170+
171+
* 将模型序列化数组或json字符串
172+
173+
```
174+
let toArr1 = smartModels.toArray()
175+
let toArrStr1 = smartModels.toJSONString()
176+
```
177+
178+
179+
180+
181+
182+
183+
184+
### 4. 解码完成的回调
185+
186+
使用 `didFinishMapping` 处理解码完成时的回调。 两者完全一样,不需要任何替换工作量。
187+
188+
#### HandyJSON
189+
190+
```
191+
struct HandyModel: HandyJSON {
192+
var name: String = ""
193+
func didFinishMapping() {
194+
}
195+
}
196+
```
197+
198+
#### SmartCodable
199+
200+
```
201+
struct SmartModel: SmartCodable {
202+
var name: String = ""
203+
func didFinishMapping() {
204+
}
205+
}
206+
```
207+
208+
209+
210+
211+
212+
### 5. 自定义解析key
213+
214+
这个情况下,需要较大的工作量,处理自定义解析策略。
215+
216+
分为两种情况:
217+
218+
* 忽略某些key的映射
219+
* 自定义key的映射
220+
221+
#### HandyJSON
222+
223+
`mutating func mapping(mapper: HelpingMapper) `方法中
224+
225+
通过 `mapper >>>` 处理解析的忽略;
226+
227+
通过 `mapper <<<` 自定义映射关系。
228+
229+
```
230+
struct HandyModel: HandyJSON {
231+
var name: String = ""
232+
var age: Int?
233+
var ignoreKey: String = "忽略的key"
234+
235+
mutating func mapping(mapper: HelpingMapper) {
236+
mapper <<<
237+
self.name <-- ["nick_name", "realName"]
238+
mapper <<<
239+
self.age <-- "self_age"
240+
mapper >>>
241+
self.ignoreKey
242+
}
243+
}
244+
```
245+
246+
#### SmartCodable
247+
248+
通过重写 `CodingKeys` 删除不需要解析的`case`,达到忽略解析的目的。
249+
250+
通过`func mapping()` 自定义映射关系。
251+
252+
```
253+
struct SmartModel: SmartCodable {
254+
var name: String = ""
255+
var age: Int?
256+
var ignoreKey: String = "忽略的key"
257+
258+
enum CodingKeys: CodingKey {
259+
case name
260+
case age
261+
// case ignoreKey
262+
}
263+
264+
static func mappingForKey() -> [SmartKeyTransformer]? {
265+
[
266+
CodingKeys.name <--- ["nick_name", "realName"],
267+
CodingKeys.age <--- "self_age"
268+
]
269+
}
270+
}
271+
```
272+
273+
274+
275+
276+
277+
278+
279+
### 6. 解析Any
280+
281+
在Any的解析中,HandyJSON可以无障碍的解析Any。但是SmartCodable需要借助 **SmartAny** 类型解析。
282+
283+
#### HandyJSON
284+
285+
```
286+
struct HandyModel: HandyJSON {
287+
var name: Any?
288+
var dict: [String: Any] = [:]
289+
}
290+
291+
guard let handyModel = HandyModel.deserialize(from: dict) else { return }
292+
print(handyModel.name)
293+
print(handyModel.dict)
294+
```
295+
296+
297+
298+
#### SmartCodable
299+
300+
需要借助 **SmartAny** 类型解析,并且在使用解析数据的时候,需要调用 `peel` 解包。
301+
302+
```
303+
struct SmartModel: SmartCodable {
304+
@SmartAny
305+
var name: Any?
306+
307+
@SmartAny
308+
var dict: [String: Any] = [:]
309+
}
310+
311+
guard let smartModel = SmartModel.deserialize(from: dict) else { return }
312+
print(smartModel.name)
313+
print(smartModel.dict)
314+
```
315+
316+
317+
318+
## 7. 处理继承关系
319+
320+
HandyJSON可以无障碍的支持解析继承关系。但是SmartCodable需要手动处理继承关系的解析。
321+
322+
#### HandyJSON
323+
324+
```
325+
class HandyBaseModel: HandyJSON {
326+
var name: String?
327+
required init() { }
328+
}
329+
330+
class HandyModel: HandyBaseModel {
331+
var age: Int?
332+
}
333+
```
334+
335+
336+
337+
#### SmartCodable
338+
339+
```
340+
class BaseModel: SmartCoable {
341+
var name: String?
342+
required init() { }
343+
}
344+
345+
@SmartSubclass
346+
class HandyModel: BaseModel {
347+
var age: Int?
348+
}
349+
```
350+
351+
352+
353+
### 8. 枚举的解析
354+
355+
需要做一定的兼容。
356+
357+
#### HandyJSON
358+
359+
```
360+
enum HandySex: String, HandyJSONEnum {
361+
case man
362+
case women
363+
}
364+
365+
struct HandyModel: HandyJSON {
366+
var sex: HandySex = .man
367+
}
368+
```
369+
370+
371+
372+
#### SmartCodable
373+
374+
```
375+
enum SmartSex: String, SmartCaseDefaultable {
376+
case man
377+
case women
378+
}
379+
380+
struct SmartModel: SmartCodable {
381+
var sex: SmartSex = .man
382+
}
383+
```
384+

0 commit comments

Comments
 (0)