Skip to content

Commit 3ccf03d

Browse files
committed
simplify apis
1 parent 0946a99 commit 3ccf03d

25 files changed

+715
-726
lines changed

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
---
44

5-
## new
6-
- Use rwlock in ConvertibleConfig
5+
## [1.1.0](https://github.com/kakaopensource/KakaJSON/releases/tag/1.0.0) (2019-08-27)
6+
- Remove locks in ConvertibleConfig
7+
- Simplify apis
78
- Merged pull requests
89
- [simplify optional.kj_value](https://github.com/kakaopensource/KakaJSON/pull/16)
910
- [replace symbol ~= with pattern keyword](https://github.com/kakaopensource/KakaJSON/pull/17)

KakaJSON.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "KakaJSON"
3-
s.version = "1.0.0"
3+
s.version = "1.1.0"
44
s.summary = "Fast conversion between JSON and model in Swift"
55
s.homepage = "https://github.com/kakaopensource/KakaJSON"
66
s.license = { :type => "MIT" }

KakaJSON/Convert/Convertible.swift

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ extension Array: ModelPropertyKey where Element == String {}
1919
public typealias JSONPropertyKey = String
2020

2121
/// all the models who want to convert should conform to `Convertible`
22+
/// please let struct or class conform to `Convertible`
2223
public protocol Convertible {
2324
init()
2425

@@ -89,7 +90,7 @@ public protocol Convertible {
8990
///
9091
/// - Parameters:
9192
/// - json: A json did be converted from model
92-
func kj_didConvertToJSON(json: [String: Any]?)
93+
func kj_didConvertToJSON(json: [String: Any])
9394
}
9495

9596
/// default implementation
@@ -114,7 +115,7 @@ public extension Convertible {
114115
return ConvertibleConfig.JSONValue(from: modelValue, property, Self.self)
115116
}
116117
func kj_willConvertToJSON() {}
117-
func kj_didConvertToJSON(json: [String: Any]?) {}
118+
func kj_didConvertToJSON(json: [String: Any]) {}
118119
}
119120

120121
// MARK: - Wrapper for Convertible
@@ -141,22 +142,22 @@ public struct ConvertibleKJ_M<T: Convertible> {
141142
self.basePtr = basePtr
142143
}
143144

144-
/// JSONObject -> Model
145+
/// JSONData -> Model
145146
public func convert(from jsonData: Data) {
146147
basePtr.pointee.kj_convert(from: jsonData)
147148
}
148149

149-
/// JSONObject -> Model
150+
/// JSONData -> Model
150151
public func convert(from jsonData: NSData) {
151152
basePtr.pointee.kj_convert(from: jsonData as Data)
152153
}
153154

154-
/// JSONObject -> Model
155+
/// JSONString -> Model
155156
public func convert(from jsonString: String) {
156157
basePtr.pointee.kj_convert(from: jsonString)
157158
}
158159

159-
/// JSONObject -> Model
160+
/// JSONString -> Model
160161
public func convert(from jsonString: NSString) {
161162
basePtr.pointee.kj_convert(from: jsonString as String)
162163
}
@@ -179,12 +180,12 @@ public struct ConvertibleKJ<T: Convertible> {
179180
}
180181

181182
/// Model -> JSONObject
182-
public func JSONObject() -> [String: Any]? {
183+
public func JSONObject() -> [String: Any] {
183184
return base.kj_JSONObject()
184185
}
185186

186187
/// Model -> JSONString
187-
public func JSONString(prettyPrinted: Bool = false) -> String? {
188+
public func JSONString(prettyPrinted: Bool = false) -> String {
188189
return base.kj_JSONString(prettyPrinted: prettyPrinted)
189190
}
190191
}
@@ -271,22 +272,24 @@ extension Convertible {
271272

272273
private mutating
273274
func _modelTypeValue(_ jsonValue: Any,
274-
_ modelType: Any.Type,
275+
_ modelType: Convertible.Type,
275276
_ propertyType: Any.Type) -> Any? {
276277
// don't use `propertyType is XX.Type`
277278
// because it may be an `Any` type
278-
if let json = jsonValue as? [Any],
279-
let models = json.kj.modelArray(anyType: modelType) {
280-
return propertyType is NSMutableArray.Type
281-
? NSMutableArray(array: models)
282-
: models
279+
if let json = jsonValue as? [Any] {
280+
let models = json.kj.modelArray(type: modelType)
281+
if !models.isEmpty {
282+
return propertyType is NSMutableArray.Type
283+
? NSMutableArray(array: models)
284+
: models
285+
}
283286
}
284287

285288
if let json = jsonValue as? [String: Any] {
286289
if let jsonDict = jsonValue as? [String: [String: Any]?] {
287290
var modelDict = [String: Any]()
288291
for (k, v) in jsonDict {
289-
guard let m = v?.kj.model(anyType: modelType) else { continue }
292+
guard let m = v?.kj.model(type: modelType) else { continue }
290293
modelDict[k] = m
291294
}
292295
guard modelDict.count > 0 else { return jsonValue }
@@ -295,7 +298,7 @@ extension Convertible {
295298
? NSMutableDictionary(dictionary: modelDict)
296299
: modelDict
297300
} else {
298-
return json.kj.model(anyType: modelType)
301+
return json.kj.model(type: modelType)
299302
}
300303
}
301304
return jsonValue
@@ -304,14 +307,15 @@ extension Convertible {
304307

305308
// MARK: - Model -> JSON
306309
extension Convertible {
307-
func kj_JSONObject() -> [String: Any]? {
310+
func kj_JSONObject() -> [String: Any] {
311+
var json = [String: Any]()
308312
guard let mt = Metadata.type(self) as? ModelType else {
309313
Logger.warnning("Not a class or struct instance.")
310-
return nil
314+
return json
311315
}
312316
guard let properties = mt.properties else {
313317
Logger.warnning("Don't have any property.")
314-
return nil
318+
return json
315319
}
316320

317321
kj_willConvertToJSON()
@@ -324,7 +328,6 @@ extension Convertible {
324328
let ptr = model._ptr()
325329

326330
// get JSON from model
327-
var json = [String: Any]()
328331
for property in properties {
329332
// value filter
330333
guard let value = kj_JSONValue(
@@ -338,17 +341,17 @@ extension Convertible {
338341
kj_JSONKey(from: property))] = v
339342
}
340343

341-
kj_didConvertToJSON(json: json.isEmpty ? nil : json)
344+
kj_didConvertToJSON(json: json)
342345

343346
return json
344347
}
345348

346-
func kj_JSONString(prettyPrinted: Bool = false) -> String? {
349+
func kj_JSONString(prettyPrinted: Bool = false) -> String {
347350
if let str = JSONSerialization.kj_string(kj_JSONObject() as Any,
348351
prettyPrinted: prettyPrinted) {
349352
return str
350353
}
351354
Logger.error("Failed to get JSONString from JSON.")
352-
return nil
355+
return ""
353356
}
354357
}

KakaJSON/Convert/Values.swift

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public struct Values {
2020
switch type {
2121
case is NumberValue.Type: return _number(v, type)
2222
case is StringValue.Type: return _string(v, type)
23-
case is Convertible.Type: return _model(v, type)
23+
case let ct as Convertible.Type: return _model(v, ct)
2424
case is DateValue.Type: return _date(v)
2525
case is ArrayValue.Type: return _array(v, type)
2626
case is DictionaryValue.Type: return _dictionary(v, type)
@@ -73,9 +73,9 @@ private extension Values {
7373
return lower
7474
}
7575

76-
static func _model(_ value: Any, _ type: Any.Type) -> Any? {
76+
static func _model(_ value: Any, _ type: Convertible.Type) -> Convertible? {
7777
guard let json = value as? [String: Any] else { return nil }
78-
return json.kj.model(anyType: type)
78+
return json.kj.model(type: type)
7979
}
8080

8181
static func _anyArray(_ value: Any) -> [Any]? {
@@ -89,7 +89,7 @@ private extension Values {
8989
let mt = Metadata.type(type)
9090
if let type = (mt as? NominalType)?.genericTypes?.first,
9191
let modelType = type~! as? Convertible.Type {
92-
return json.kj.modelArray(anyType: modelType)
92+
return json.kj.modelArray(type: modelType)
9393
}
9494

9595
return type is NSMutableArray.Type
@@ -115,7 +115,7 @@ private extension Values {
115115

116116
var modelDict = [String: Any]()
117117
for (k, v) in json {
118-
guard let m = v?.kj.model(anyType: modelType) else { continue }
118+
guard let m = v?.kj.model(type: modelType) else { continue }
119119
modelDict[k] = m
120120
}
121121
return modelDict.isEmpty ? nil : modelDict
@@ -181,18 +181,16 @@ private extension Values {
181181
return Double("\(decimal)").flatMap { NSNumber(value: $0) }
182182
}
183183

184-
static func _JSONValue(from set: SetValue) -> Any? {
184+
static func _JSONValue(from set: SetValue) -> Any {
185185
return _JSONValue(from: set.kj_array())
186186
}
187187

188-
static func _JSONValue(from array: [Any]) -> Any? {
189-
let newArray = array.compactMap { JSONValue($0) }
190-
return newArray.isEmpty ? nil : newArray
188+
static func _JSONValue(from array: [Any]) -> Any {
189+
return array.compactMap { JSONValue($0) }
191190
}
192191

193-
static func _JSONValue(from dict: [String: Any]) -> Any? {
194-
let newDict = dict.compactMapValues { JSONValue($0) }
195-
return newDict.isEmpty ? nil : newDict
192+
static func _JSONValue(from dict: [String: Any]) -> Any {
193+
return dict.compactMapValues { JSONValue($0) }
196194
}
197195

198196
static func _JSONValue(from num: NumberValue) -> Any? {

KakaJSON/Extension/Array+KJ.swift

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,47 +15,44 @@ extension NSSet: KJCompatible {}
1515

1616
public extension KJ where Base: ExpressibleByArrayLiteral & Sequence {
1717
/// JSONObjectArray -> ModelArray
18-
func modelArray<M: Convertible>(_ type: M.Type) -> [M]? {
19-
return modelArray(anyType: type) as? [M]
18+
func modelArray<M: Convertible>(_ type: M.Type) -> [M] {
19+
return modelArray(type: type) as! [M]
2020
}
2121

2222
/// JSONObjectArray -> ModelArray
23-
func modelArray(anyType: Any.Type) -> [Any]? {
24-
guard let t = anyType as? Convertible.Type,
25-
let mt = Metadata.type(anyType) as? ModelType,
23+
func modelArray(type: Convertible.Type) -> [Convertible] {
24+
guard let mt = Metadata.type(type) as? ModelType,
2625
let _ = mt.properties
27-
else { return nil }
28-
let arr = base.compactMap { element -> Any? in
29-
switch element {
30-
case let dict as [String: Any]: return dict.kj_fastModel(t)
31-
case let dict as Data: return dict.kj_fastModel(t)
32-
case let dict as String: return dict.kj_fastModel(t)
26+
else { return [] }
27+
return base.compactMap {
28+
switch $0 {
29+
case let dict as [String: Any]: return dict.kj_fastModel(type)
30+
case let dict as Data: return dict.kj_fastModel(type)
31+
case let dict as String: return dict.kj_fastModel(type)
3332
default: return nil
3433
}
3534
}
36-
return arr.isEmpty ? nil : arr
3735
}
3836

3937
/// ModelArray -> JSONObjectArray
40-
func JSONObjectArray() -> [[String: Any]]? {
41-
let arr = base.compactMap { element -> [String: Any]? in
42-
(element~! as? Convertible)?.kj_JSONObject()
38+
func JSONObjectArray() -> [[String: Any]] {
39+
return base.compactMap {
40+
($0~! as? Convertible)?.kj_JSONObject()
4341
}
44-
return arr.isEmpty ? nil : arr
4542
}
4643

4744
/// Array -> JSONArray
48-
func JSONArray() -> [Any]? {
49-
return Values.JSONValue(base) as? [Any]
45+
func JSONArray() -> [Any] {
46+
return Values.JSONValue(base) as! [Any]
5047
}
5148

52-
/// Array -> JSONArray
53-
func JSONString(prettyPrinted: Bool = false) -> String? {
49+
/// Array -> JSONString
50+
func JSONString(prettyPrinted: Bool = false) -> String {
5451
if let str = JSONSerialization.kj_string(JSONArray(),
5552
prettyPrinted: prettyPrinted) {
5653
return str
5754
}
5855
Logger.error("Failed to get JSONString from JSON.")
59-
return nil
56+
return ""
6057
}
6158
}

KakaJSON/Extension/Data+KJ.swift

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,52 +14,52 @@ extension NSData: KJCompatible {}
1414
public extension KJ where Base == Data {
1515
/// JSONObject -> Model
1616
func model<M: Convertible>(_ type: M.Type) -> M? {
17-
return model(anyType: type) as? M
17+
return model(type: type) as? M
1818
}
1919

2020
/// JSONObject -> Model
21-
func model(anyType: Any.Type) -> Any? {
21+
func model(type: Convertible.Type) -> Convertible? {
2222
if let json = JSONSerialization.kj_JSON(base, [String: Any].self) {
23-
return json.kj.model(anyType: anyType)
23+
return json.kj.model(type: type)
2424
}
2525
Logger.error("Failed to get JSON from JSONData.")
2626
return nil
2727
}
2828

2929
/// JSONObjectArray -> ModelArray
30-
func modelArray<M: Convertible>(_ type: M.Type) -> [M]? {
31-
return modelArray(anyType: type) as? [M]
30+
func modelArray<M: Convertible>(_ type: M.Type) -> [M] {
31+
return modelArray(type: type) as! [M]
3232
}
3333

3434
/// JSONObjectArray -> ModelArray
35-
func modelArray(anyType: Any.Type) -> [Any]? {
35+
func modelArray(type: Convertible.Type) -> [Convertible] {
3636
if let json = JSONSerialization.kj_JSON(base, [Any].self) {
37-
return json.kj.modelArray(anyType: anyType)
37+
return json.kj.modelArray(type: type)
3838
}
3939
Logger.error("Failed to get JSON from JSONData.")
40-
return nil
40+
return []
4141
}
4242
}
4343

4444
public extension KJ where Base: NSData {
4545
/// JSONObject -> Model
4646
func model<M: Convertible>(_ type: M.Type) -> M? {
47-
return model(anyType: type) as? M
47+
return (base as Data).kj.model(type)
4848
}
4949

5050
/// JSONObject -> Model
51-
func model(anyType: Any.Type) -> Any? {
52-
return (base as Data).kj.model(anyType: anyType)
51+
func model(type: Convertible.Type) -> Convertible? {
52+
return (base as Data).kj.model(type: type)
5353
}
5454

5555
/// JSONObjectArray -> ModelArray
56-
func modelArray<M: Convertible>(_ type: M.Type) -> [M]? {
57-
return modelArray(anyType: type) as? [M]
56+
func modelArray<M: Convertible>(_ type: M.Type) -> [M] {
57+
return (base as Data).kj.modelArray(type)
5858
}
5959

6060
/// JSONObjectArray -> ModelArray
61-
func modelArray(anyType: Any.Type) -> [Any]? {
62-
return (base as Data).kj.modelArray(anyType: anyType)
61+
func modelArray(type: Convertible.Type) -> [Convertible] {
62+
return (base as Data).kj.modelArray(type: type)
6363
}
6464
}
6565

0 commit comments

Comments
 (0)