Skip to content

Commit 2732a53

Browse files
committed
Added NSCoding protocol
1 parent 52f62a2 commit 2732a53

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

SwiftyJSONAccelerator/Base Files/BaseTemplate.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,14 @@ public {OBJECT_KIND} {OBJECT_NAME} {
3939
{INITALIZER}
4040

4141
}
42+
43+
// MARK: NSCoding Protocol
44+
required public init(coder aDecoder: NSCoder) {
45+
{DECODERS}
46+
}
47+
48+
func encodeWithCoder(aCoder: NSCoder) {
49+
{ENCODERS}
50+
}
51+
4252
}

SwiftyJSONAccelerator/SJModelGenerator.swift

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ public class ModelGenerator {
7070
var declarations: String = ""
7171
var stringConstants: String = ""
7272
var initalizers: String = ""
73+
var encoders: String = ""
74+
var decoders: String = ""
7375

7476
let className = buildClassName(className, prefix: self.prefix!)
7577
if let object = parsedJSONObject.dictionary {
@@ -80,30 +82,35 @@ public class ModelGenerator {
8082
let variableType: String = checkType(subJson)
8183

8284
stringConstants = stringConstants.stringByAppendingFormat(stringConstantDeclrationBuilder(stringConstantName, key: key))
85+
encoders = encoders.stringByAppendingFormat("%@\n", encoderForVariable(variableName, key: stringConstantName, type: variableType))
8386

8487
if variableType == VariableType.kArrayType {
8588

8689
// If the array has objects, then take the first one and proces it to generate a model.
8790
if subJson.arrayValue.count > 0 {
8891
let subClassName = generateModelForClass(subJson.arrayValue[0], className: variableName)
8992
declarations = declarations.stringByAppendingFormat(variableDeclarationBuilder(variableName, type: "[\(subClassName)]"))
90-
initalizers = initalizers.stringByAppendingFormat("%@\n", initalizerForObjectArray(variableName, className: subClassName, key: key))
93+
initalizers = initalizers.stringByAppendingFormat("%@\n", initalizerForObjectArray(variableName, className: subClassName, key: stringConstantName))
94+
decoders = decoders.stringByAppendingFormat("%@\n", decoderForVariable(variableName,key: stringConstantName, type: "[\(subClassName)]"))
9195
} else {
9296
// if nothing is there make it a blank array.
9397
declarations = declarations.stringByAppendingFormat(variableDeclarationBuilder(variableName, type: variableType))
94-
initalizers = initalizers.stringByAppendingFormat("%@\n", initalizerForEmptyArray(variableName, key: key))
98+
initalizers = initalizers.stringByAppendingFormat("%@\n", initalizerForEmptyArray(variableName, key: stringConstantName))
99+
95100
}
96101

97102
} else if variableType == VariableType.kObjectType {
98103

99104
let subClassName = generateModelForClass(subJson, className: variableName)
100105
declarations = declarations.stringByAppendingFormat(variableDeclarationBuilder(variableName, type: subClassName))
101-
initalizers = initalizers.stringByAppendingFormat("%@\n", initalizerForObject(variableName, className: subClassName, key: key))
106+
initalizers = initalizers.stringByAppendingFormat("%@\n", initalizerForObject(variableName, className: subClassName, key: stringConstantName))
107+
decoders = decoders.stringByAppendingFormat("%@\n", decoderForVariable(variableName,key: stringConstantName, type: subClassName))
102108

103109
} else {
104110

105111
declarations = declarations.stringByAppendingFormat(variableDeclarationBuilder(variableName, type: variableType))
106-
initalizers = initalizers.stringByAppendingFormat("%@\n", initalizerForVariable(variableName, type: variableType, key: key))
112+
initalizers = initalizers.stringByAppendingFormat("%@\n", initalizerForVariable(variableName, type: variableType, key: stringConstantName))
113+
decoders = decoders.stringByAppendingFormat("%@\n", decoderForVariable(variableName,key: stringConstantName, type: variableType))
107114

108115
}
109116

@@ -126,6 +133,8 @@ public class ModelGenerator {
126133
content = content.stringByReplacingOccurrencesOfString("{STRING_CONSTANT_BLOCK}", withString: stringConstants)
127134
content = content.stringByReplacingOccurrencesOfString("{PROPERTIES}", withString: declarations)
128135
content = content.stringByReplacingOccurrencesOfString("{INITALIZER}", withString: initalizers)
136+
content = content.stringByReplacingOccurrencesOfString("{ENCODERS}", withString: encoders)
137+
content = content.stringByReplacingOccurrencesOfString("{DECODERS}", withString: decoders)
129138

130139
writeToFile(className, content: content, path: filePath)
131140

@@ -217,20 +226,38 @@ public class ModelGenerator {
217226

218227

219228
internal func initalizerForVariable(variableName: String, var type: String, key: String) -> String {
220-
type.replaceRange(type.startIndex...type.startIndex, with: String(type[type.startIndex]).lowercaseString)
221-
return "\t\tif let value = json[\"\(key)\"].\(type) {\n\t\t\t\(variableName) = value\n\t\t}"
229+
if type == VariableType.kNumberType {
230+
type = "number"
231+
} else {
232+
type.replaceRange(type.startIndex...type.startIndex, with: String(type[type.startIndex]).lowercaseString)
233+
}
234+
return "\t\tif let value = json[\(key)].\(type) {\n\t\t\t\(variableName) = value\n\t\t}"
222235
}
223236

224237
internal func initalizerForObject(variableName: String, className: String, key: String) -> String {
225-
return "\t\t\(variableName) = \(className)(json: json[\"\(key)\"])"
238+
return "\t\t\(variableName) = \(className)(json: json[\(key)])"
226239
}
227240

228241
internal func initalizerForEmptyArray(variableName: String, key: String) -> String {
229-
return "\t\tif let value = json[\"\(key)\"].array {\n\t\t\t\(variableName) = value\n\t\t}"
242+
return "\t\tif let value = json[\(key)].array {\n\t\t\t\(variableName) = value\n\t\t}"
230243
}
231244

232245
internal func initalizerForObjectArray(variableName: String, className: String, key: String) -> String {
233-
return "\t\t\(variableName) = []\n\t\tif let items = json[\"\(key)\"].array {\n\t\t\tfor item in items {\n\t\t\t\t\(variableName)?.append(\(className)(json: item))\n\t\t\t}\n\t\t}\n"
246+
return "\t\t\(variableName) = []\n\t\tif let items = json[\(key)].array {\n\t\t\tfor item in items {\n\t\t\t\t\(variableName)?.append(\(className)(json: item))\n\t\t\t}\n\t\t}\n"
247+
}
248+
249+
internal func encoderForVariable(variableName: String, key: String, type: String) -> String {
250+
if type == VariableType.kBoolType {
251+
return "\t\taCoder.encodeBool(\(variableName), forKey: \(key))"
252+
}
253+
return "\t\taCoder.encodeObject(\(variableName), forKey: \(key))"
254+
}
255+
256+
internal func decoderForVariable(variableName: String, key: String, type: String) -> String {
257+
if type == VariableType.kBoolType {
258+
return "\t\tself.\(variableName) = aDecoder.decodeBoolForKey(\(key))"
259+
}
260+
return "\t\tself.\(variableName) = aDecoder.decodeObjectForKey(\(key)) as? \(type)"
234261
}
235262

236263
internal func todayDateString() -> String {
@@ -277,5 +304,15 @@ public class ModelGenerator {
277304
}
278305
}
279306

307+
/*
308+
required init(coder aDecoder: NSCoder) {
309+
self.bottlesArray = aDecoder.decodeObjectForKey("bottleArray") as NSMutableArray
310+
}
311+
312+
func encodeWithCoder(aCoder: NSCoder) {
313+
aCoder.encodeObject(bottlesArray, forKey: "bottleArray")
314+
}
315+
*/
316+
280317

281318
}

0 commit comments

Comments
 (0)