Skip to content

Commit 0c5b9bf

Browse files
committed
支持隐式类型推断
1 parent ac4f559 commit 0c5b9bf

13 files changed

Lines changed: 214 additions & 171 deletions

Example/Podfile.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ PODS:
99
- FBSnapshotTestCase/SwiftSupport (2.1.4):
1010
- FBSnapshotTestCase/Core
1111
- HandyJSON (5.0.0-beta.1)
12-
- SmartCodable/Core (5.0.3)
13-
- SmartCodable/Inherit (5.0.3):
12+
- SmartCodable/Core (5.0.4)
13+
- SmartCodable/Inherit (5.0.4):
1414
- SmartCodable/Core
1515
- SnapKit (5.6.0)
1616

@@ -51,7 +51,7 @@ SPEC CHECKSUMS:
5151
CodableWrapper: fb0b898e73f2e5b996e9d82b6c8441da72e50256
5252
FBSnapshotTestCase: 094f9f314decbabe373b87cc339bea235a63e07a
5353
HandyJSON: 582477127ab3ab65bd2e471815f1a7b846856978
54-
SmartCodable: 7d06ad219679d77a72d60fc07eb411f7b18bb873
54+
SmartCodable: 22f8eb3693a892afeae6056e9c1beeed9b7c83cb
5555
SnapKit: e01d52ebb8ddbc333eefe2132acf85c8227d9c25
5656

5757
PODFILE CHECKSUM: 60610a5cdfa6a077fd7b8e2be458175cd4b92762

Example/Pods/CodableWrapper/Package.resolved

Lines changed: 0 additions & 14 deletions
This file was deleted.

Example/Pods/Local Podspecs/SmartCodable.podspec.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Example/Pods/Manifest.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Example/Pods/Target Support Files/SmartCodable/SmartCodable-Info.plist

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Example/SmartCodable/Test2ViewController.swift

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,25 @@
88

99
import SmartCodable
1010
import BTPrint
11-
import CodableWrapper
1211

1312
class Test2ViewController: BaseViewController {
1413

1514
override func viewDidLoad() {
1615
super.viewDidLoad()
1716

1817

19-
let dict: [String: Any] = [
20-
"name": "Mccc",
21-
"age": 20,
22-
]
23-
24-
let model = StudentModel.deserialize(from: dict)
25-
print(model?.name as Any)
26-
print(model?.age as Any)
27-
28-
let transDict = model?.toJSONString(prettyPrint: true) ?? ""
29-
print("\n Model -> JSON")
30-
print(transDict)
18+
// let dict: [String: Any] = [
19+
// "name": "Mccc",
20+
// "age": 20,
21+
// ]
22+
//
23+
// let model = StudentModel.deserialize(from: dict)
24+
// print(model?.name as Any)
25+
// print(model?.age as Any)
26+
//
27+
// let transDict = model?.toJSONString(prettyPrint: true) ?? ""
28+
// print("\n Model -> JSON")
29+
// print(transDict)
3130
}
3231

3332
class BaseModel: SmartCodable {
@@ -39,8 +38,51 @@ class Test2ViewController: BaseViewController {
3938
class StudentModel: BaseModel {
4039
var age: Int?
4140
}
41+
42+
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
43+
testSmartCodableInherit()
44+
}
4245
}
4346

4447

4548

4649

50+
enum Gender: Int, SmartCaseDefaultable {
51+
case unknown
52+
case male
53+
case female
54+
}
55+
56+
class SMCClassAnimal: SmartCodable {
57+
var age: Int = 0
58+
var sex: Gender = .unknown
59+
60+
required init() { }
61+
}
62+
63+
@SmartSubclass
64+
class SMCClassPerson: SMCClassAnimal {
65+
var name: String?
66+
var motto: String?
67+
var height = 0
68+
var temp = 0
69+
var a = 1.1
70+
var b = false
71+
var c = ""
72+
var d = Date()
73+
var e = Date()
74+
}
75+
76+
func testSmartCodableInherit() {
77+
let deJsonStr = """
78+
{
79+
"name": "张三丰",
80+
"age": "23",
81+
"motto": "nothing is possible.",
82+
"sex": 1,
83+
"height": 175
84+
}
85+
"""
86+
let obj = SMCClassPerson.deserialize(from: deJsonStr)
87+
print("height:", obj?.height)
88+
}
Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,22 @@
1-
import SmartCodable
1+
import CodableWrapper
22

33
class Test3ViewController: BaseViewController {
44

55
override func viewDidLoad() {
66
super.viewDidLoad()
77

8-
let dict: [String: Any] = [
9-
"nickName": "String",
10-
]
11-
guard let model = Model.deserialize(from: dict) else { return }
12-
print(model)
138

14-
let tranformer1 = model.toDictionary()
15-
print(tranformer1 as Any)
169
}
1710

18-
struct Model: SmartCodable {
11+
@Codable
12+
class Model {
1913
var name: String = ""
20-
var nickName: String = ""
21-
var bigName: String = ""
22-
23-
enum CodingKeys: CodingKey {
24-
case name
25-
case nickName
26-
case bigName
27-
}
28-
29-
static func mappingForKey() -> [SmartKeyTransformer]? {
30-
[
31-
CodingKeys.name <--- ["nickName"],
32-
CodingKeys.bigName <--- ["nickName"],
33-
]
34-
}
35-
36-
37-
func encode(to encoder: any Encoder) throws {
38-
var container = encoder.container(keyedBy: CodingKeys.self)
39-
try container.encode(nickName, forKey: CodingKeys.nickName)
40-
try container.encode(name, forKey: CodingKeys.name)
41-
try container.encode(bigName, forKey: CodingKeys.bigName)
42-
43-
}
14+
}
15+
16+
@CodableSubclass
17+
class SubModel: Model {
18+
// var age = [:]
19+
var age1: Int?
4420
}
4521
}
4622

Example/SmartCodable/TestViewController.swift

Lines changed: 13 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -42,69 +42,27 @@ class TestViewController: BaseViewController {
4242

4343
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
4444

45-
let dict: [String: Any] = [
46-
"color": "000000",
47-
"color1": "ffffff",
48-
"color2": "#000000",
49-
"color3": "0xffffff",
50-
"date": "2024-02-01",
51-
"date1": "2024-02-01 11:11",
52-
"date2": "2024-02-01 11:11:11",
53-
"date3": "1746501765",
54-
"date4": "1746501764000"
55-
]
56-
57-
let model = Model.deserialize(from: dict)
58-
// print(model?.color)
59-
// print(model?.color2)
60-
// print(model?.color3)
6145

62-
print(model?.date)
63-
// print(model?.date1)
64-
// print(model?.date2)
65-
// print(model?.date3)
66-
// print(model?.date4)
46+
let dict: [String: Any] = [
47+
"temp": "temp",
48+
"age": []
49+
]
6750

68-
print("\n\n")
51+
guard let model = Model.deserialize(from: dict) else { return }
6952

53+
print(model)
7054

71-
let transDict = model?.toJSONString(prettyPrint: true) ?? ""
72-
print(transDict)
55+
let dict1 = model.toDictionary() ?? [:]
56+
let json = model.toJSONString(prettyPrint: true) ?? ""
7357

58+
print(dict1)
59+
print(json)
7460
}
7561

76-
7762
struct Model: SmartCodable {
78-
//
79-
// @SmartHexColor
80-
// var color: UIColor?
81-
//
82-
// @SmartHexColor
83-
// var color1: UIColor?
84-
// @SmartHexColor
85-
// var color2: UIColor?
86-
// @SmartHexColor
87-
// var color3: UIColor?
88-
89-
90-
@SmartAny
91-
var date: [String: Any] = [:]
92-
// @SmartDate
93-
// var date1: Date?
94-
// @SmartDate
95-
// var date2: Date?
96-
// @SmartDate
97-
// var date3: Date?
98-
// @SmartDate
99-
// var date4: Date?
100-
101-
102-
103-
// static func mappingForValue() -> [SmartValueTransformer]? {
104-
// [
105-
// CodingKeys.height <--- SmartDateTransformer(isMilliseconds: true)
106-
// ]
107-
// }
63+
var name: String?
64+
var age: Int?
65+
var temp: String?
10866
}
10967
}
11068

SmartCodable.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
Pod::Spec.new do |s|
1414
s.name = 'SmartCodable'
15-
s.version = '5.0.3'
15+
s.version = '5.0.4'
1616
s.summary = 'Swift数据解析库'
1717

1818
s.homepage = 'https://github.com/iAmMccc/SmartCodable'
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// MacroError.swift
3+
// SmartCodable
4+
//
5+
// Created by qixin on 2025/5/14.
6+
//
7+
8+
import Foundation
9+
10+
struct MacroError: CustomStringConvertible, Error {
11+
let text: String
12+
13+
init(_ text: String) {
14+
self.text = text
15+
}
16+
17+
var description: String {
18+
text
19+
}
20+
}
21+
22+
23+
extension MacroError {
24+
static func requiresExplicitType(for name: String, inferredFrom reason: String) -> MacroError {
25+
.init("Property '\(name)' requires an explicit type annotation; type cannot be inferred from \(reason) ")
26+
}
27+
}

0 commit comments

Comments
 (0)