Skip to content

Commit 6901727

Browse files
- added support for implicitly unwrapped optionals
1 parent 1a5c608 commit 6901727

File tree

3 files changed

+251
-56
lines changed

3 files changed

+251
-56
lines changed

ObjectMapper/Core/FromJSON.swift

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import Foundation
1010

1111
class FromJSON<CollectionType> {
12-
12+
13+
/// Basic type
1314
func basicType<FieldType>(inout field: FieldType, object: AnyObject?) {
1415
basicType(&field, object: object as? FieldType)
1516
}
@@ -19,7 +20,8 @@ class FromJSON<CollectionType> {
1920
field = value
2021
}
2122
}
22-
23+
24+
/// optional basic type
2325
func optionalBasicType<FieldType>(inout field: FieldType?, object: AnyObject?) {
2426
optionalBasicType(&field, object: object as? FieldType)
2527
}
@@ -29,27 +31,49 @@ class FromJSON<CollectionType> {
2931
field = value
3032
}
3133
}
32-
34+
35+
/// Implicitly unwrapped optional basic type
36+
func optionalBasicType<FieldType>(inout field: FieldType!, object: AnyObject?) {
37+
optionalBasicType(&field, object: object as? FieldType)
38+
}
39+
40+
func optionalBasicType<FieldType>(inout field: FieldType!, object: FieldType?) {
41+
if let value: FieldType = object {
42+
field = value
43+
}
44+
}
45+
46+
/// Mappable object
3347
func object<N: Mappable>(inout field: N, object: AnyObject?) {
3448
if let value = object as? [String : AnyObject] {
3549
field = Mapper().map(value)
3650
}
3751
}
38-
52+
53+
/// Optional Mappable Object
3954
func optionalObject<N: Mappable>(inout field: N?, object: AnyObject?) {
4055
if let value = object as? [String : AnyObject] {
4156
field = Mapper().map(value)
4257
}
4358
}
44-
59+
60+
/// Implicitly unwrapped Optional Mappable Object
61+
func optionalObject<N: Mappable>(inout field: N!, object: AnyObject?) {
62+
if let value = object as? [String : AnyObject] {
63+
field = Mapper().map(value)
64+
}
65+
}
66+
67+
/// mappable object array
4568
func objectArray<N: Mappable>(inout field: Array<N>, object: AnyObject?) {
4669
let parsedObjects: Array<N> = parseObjectArray(object)
4770

4871
if !parsedObjects.isEmpty {
4972
field = parsedObjects
5073
}
5174
}
52-
75+
76+
/// optional mappable object array
5377
func optionalObjectArray<N: Mappable>(inout field: Array<N>?, object: AnyObject?) {
5478
let parsedObjects: Array<N> = parseObjectArray(object)
5579

@@ -59,10 +83,19 @@ class FromJSON<CollectionType> {
5983
field = parsedObjects
6084
}
6185
}
62-
63-
/**
64-
* Parses a JSON array into an array of Mappable objects
65-
*/
86+
87+
/// Implicitly unwrapped optional mappable object array
88+
func optionalObjectArray<N: Mappable>(inout field: Array<N>!, object: AnyObject?) {
89+
let parsedObjects: Array<N> = parseObjectArray(object)
90+
91+
if parsedObjects.isEmpty {
92+
field = nil
93+
} else {
94+
field = parsedObjects
95+
}
96+
}
97+
98+
///Parses a JSON array into an array of Mappable objects
6699
private func parseObjectArray<N: Mappable>(object: AnyObject?) -> Array<N>{
67100
if let JSONArray = object as? [[String : AnyObject]] {
68101
return Mapper<N>().mapArray(JSONArray)
@@ -71,9 +104,7 @@ class FromJSON<CollectionType> {
71104
return []
72105
}
73106

74-
/**
75-
* Parse a dictionary containing Mappable objects
76-
*/
107+
/// Dctionary containing Mappable objects
77108
func objectDictionary<N: Mappable>(inout field: Dictionary<String, N>, object: AnyObject?) {
78109
let parsedObjects: Dictionary<String, N> = parseObjectDictionary(object)
79110

@@ -82,9 +113,8 @@ class FromJSON<CollectionType> {
82113
}
83114
}
84115

85-
/**
86-
* Parses a dictionary containing Mappable objects to optional field
87-
*/
116+
117+
/// Optional dictionary containing Mappable objects
88118
func optionalObjectDictionary<N: Mappable>(inout field: Dictionary<String, N>?, object: AnyObject?) {
89119
let parsedObjects: Dictionary<String, N> = parseObjectDictionary(object)
90120

@@ -94,7 +124,18 @@ class FromJSON<CollectionType> {
94124
field = parsedObjects
95125
}
96126
}
97-
127+
128+
/// Implicitly unwrapped Dictionary containing Mappable objects
129+
func optionalObjectDictionary<N: Mappable>(inout field: Dictionary<String, N>!, object: AnyObject?) {
130+
let parsedObjects: Dictionary<String, N> = parseObjectDictionary(object)
131+
132+
if parsedObjects.isEmpty {
133+
field = nil
134+
} else {
135+
field = parsedObjects
136+
}
137+
}
138+
98139
/**
99140
* Parses a JSON Dictionary of dictionary into a Dictionay of Mappable objects
100141
*/

ObjectMapper/Core/Operators.swift

Lines changed: 79 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,26 @@ public func <=<T>(inout left: T?, right: Map) {
4141
}
4242
}
4343

44+
/**
45+
* Implicitly unwrapped optional object of basic type
46+
*/
47+
public func <=<T>(inout left: T!, right: Map) {
48+
if right.mappingType == MappingType.fromJSON {
49+
FromJSON<T>().optionalBasicType(&left, object: right.currentValue)
50+
} else {
51+
ToJSON().optionalBasicType(left, key: right.currentKey!, dictionary: &right.JSONDictionary)
52+
}
53+
}
54+
4455
/**
4556
* Object of Basic type with Transform
4657
*/
4758
public func <=<T, Transform: TransformType where Transform.Object == T>(inout left: T, right: (Map, Transform)) {
4859
if right.0.mappingType == MappingType.fromJSON {
4960
var value: T? = right.1.transformFromJSON(right.0.currentValue)
50-
//println("FromJSON \(value)");
5161
FromJSON<T>().basicType(&left, object: value)
5262
} else {
5363
var value: Transform.JSON? = right.1.transformToJSON(left)
54-
//println("\(left) toJSON \(value)")
5564
ToJSON().optionalBasicType(value, key: right.0.currentKey!, dictionary: &right.0.JSONDictionary)
5665
}
5766
}
@@ -62,15 +71,26 @@ public func <=<T, Transform: TransformType where Transform.Object == T>(inout le
6271
public func <=<T, Transform: TransformType where Transform.Object == T>(inout left: T?, right: (Map, Transform)) {
6372
if right.0.mappingType == MappingType.fromJSON {
6473
var value: T? = right.1.transformFromJSON(right.0.currentValue)
65-
//println("FromJSON \(value)");
6674
FromJSON<T>().optionalBasicType(&left, object: value)
6775
} else {
6876
var value: Transform.JSON? = right.1.transformToJSON(left)
69-
//println("\(left) toJSON \(value)")
7077
ToJSON().optionalBasicType(value, key: right.0.currentKey!, dictionary: &right.0.JSONDictionary)
7178
}
7279
}
7380

81+
/**
82+
* Implicitly unwrapped optional object of basic type with Transform
83+
*/
84+
public func <=<T, Transform: TransformType where Transform.Object == T>(inout left: T!, right: (Map, Transform)) {
85+
if right.0.mappingType == MappingType.fromJSON {
86+
var value: T? = right.1.transformFromJSON(right.0.currentValue)
87+
FromJSON<T>().optionalBasicType(&left, object: value)
88+
} else {
89+
var value: Transform.JSON? = right.1.transformToJSON(left)
90+
ToJSON().optionalBasicType(value, key: right.0.currentKey!, dictionary: &right.0.JSONDictionary)
91+
}
92+
}
93+
7494
// MARK:- Array of Objects with Basic Type - Array<AnyObject>
7595
/**
7696
* Array of objects with Basic types
@@ -94,6 +114,17 @@ public func <=(inout left: Array<AnyObject>?, right: Map) {
94114
}
95115
}
96116

117+
/**
118+
* Implicitly unwrapped optional array of objects with Basic type
119+
*/
120+
public func <=(inout left: Array<AnyObject>!, right: Map) {
121+
if right.mappingType == MappingType.fromJSON {
122+
FromJSON<AnyObject>().optionalBasicType(&left, object: right.currentValue)
123+
} else {
124+
ToJSON().optionalBasicArray(left, key: right.currentKey!, dictionary: &right.JSONDictionary)
125+
}
126+
}
127+
97128
// MARK:- Dictionary of Objects with Basic type - Dictionary<String, AnyObject>
98129
/**
99130
* Dictionary of objects with Basic type
@@ -106,7 +137,6 @@ public func <=(inout left: Dictionary<String, AnyObject>, right: Map) {
106137
}
107138
}
108139

109-
//
110140
/**
111141
* Optional dictionary of objects with Basic type <String, AnyObject>
112142
*/
@@ -118,6 +148,17 @@ public func <=(inout left: Dictionary<String, AnyObject>?, right: Map) {
118148
}
119149
}
120150

151+
/**
152+
* Implicitly unwrapped optional dictionary of objects with Basic type <String, AnyObject>
153+
*/
154+
public func <=(inout left: Dictionary<String, AnyObject>!, right: Map) {
155+
if right.mappingType == MappingType.fromJSON {
156+
FromJSON<AnyObject>().optionalBasicType(&left, object: right.currentValue)
157+
} else {
158+
ToJSON().optionalBasicDictionary(left, key: right.currentKey!, dictionary: &right.JSONDictionary)
159+
}
160+
}
161+
121162
// MARK:- Mappable Objects - <T: Mappable>
122163
/**
123164
* Object conforming to Mappable
@@ -141,6 +182,17 @@ public func <=<T: Mappable>(inout left: T?, right: Map) {
141182
}
142183
}
143184

185+
/**
186+
* Implicitly unwrapped optional Mappable objects
187+
*/
188+
public func <=<T: Mappable>(inout left: T!, right: Map) {
189+
if right.mappingType == MappingType.fromJSON {
190+
FromJSON<T>().optionalObject(&left, object: right.currentValue)
191+
} else {
192+
ToJSON().optionalObject(left, key: right.currentKey!, dictionary: &right.JSONDictionary)
193+
}
194+
}
195+
144196
// MARK:- Dictionary of Mappable objects - Dictionary<String, T: Mappable>
145197
/**
146198
* Dictionary of Mappable objects <String, T: Mappable>
@@ -164,6 +216,17 @@ public func <=<T: Mappable>(inout left: Dictionary<String, T>?, right: Map) {
164216
}
165217
}
166218

219+
/**
220+
* Implicitly unwrapped Optional Dictionary of Mappable object <String, T: Mappable>
221+
*/
222+
public func <=<T: Mappable>(inout left: Dictionary<String, T>!, right: Map) {
223+
if right.mappingType == MappingType.fromJSON {
224+
FromJSON<T>().optionalObjectDictionary(&left, object: right.currentValue)
225+
} else {
226+
ToJSON().optionalObjectDictionary(left, key: right.currentKey!, dictionary: &right.JSONDictionary)
227+
}
228+
}
229+
167230
// MARK:- Array of Mappable objects - Array<T: Mappable>
168231
/**
169232
* Array of Mappable objects
@@ -185,4 +248,15 @@ public func <=<T: Mappable>(inout left: Array<T>?, right: Map) {
185248
} else {
186249
ToJSON().optionalObjectArray(left, key: right.currentKey!, dictionary: &right.JSONDictionary)
187250
}
251+
}
252+
253+
/**
254+
* Implicitly unwrapped Optional array of Mappable objects
255+
*/
256+
public func <=<T: Mappable>(inout left: Array<T>!, right: Map) {
257+
if right.mappingType == MappingType.fromJSON {
258+
FromJSON<T>().optionalObjectArray(&left, object: right.currentValue)
259+
} else {
260+
ToJSON().optionalObjectArray(left, key: right.currentKey!, dictionary: &right.JSONDictionary)
261+
}
188262
}

0 commit comments

Comments
 (0)