Skip to content

Commit 07cc903

Browse files
committed
fix: resolve method fromMap when value is nil
1 parent 62db521 commit 07cc903

File tree

8 files changed

+346
-287
lines changed

8 files changed

+346
-287
lines changed

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"lint": "eslint --fix src/ tests/",
1111
"test": "mocha --reporter spec --timeout 3000 tests/*.tests.js",
1212
"test-cov": "nyc -r=lcov -r=html -r=text -r=json mocha -t 3000 -R spec tests/*.tests.js",
13-
"ci": "npm run lint && npm run test-cov && codecov"
13+
"ci": "npm run lint && npm run test-cov"
1414
},
1515
"repository": {
1616
"type": "git",
@@ -25,7 +25,6 @@
2525
},
2626
"devDependencies": {
2727
"chai": "^4.2.0",
28-
"codecov": "^3",
2928
"eslint": "^6",
3029
"expect.js": "^0.3.1",
3130
"has-flag": "^4.0.0",

src/langs/swift/combinator.js

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,22 +1062,28 @@ class Combinator extends CombinatorBase {
10621062
};
10631063

10641064
emitter.emitln(`var l${depth} : [${this.emitType(type.itemType)}] = []`, this.level);
1065-
emitter.emitln(`for v${depth} in ${name} as! [Any] {`, this.level);
1065+
emitter.emitln(`for v${depth} in ${name} as! [Any?] {`, this.level);
1066+
this.levelUp();
1067+
emitter.emitln(`if v${depth} != nil {`, this.level);
10661068
this.levelUp();
10671069
this.emitComplexFromMap(emitter, propInfo, `l${depth}`, depth + 1);
10681070
this.levelDown();
10691071
emitter.emitln('}', this.level);
1072+
this.levelDown();
1073+
emitter.emitln('}', this.level);
10701074
if (is.array(parentType)) {
10711075
emitter.emitln(`${carrier}.append(l${depth})`, this.level);
10721076
} else if (is.map(parentType)) {
10731077
const num = depth - 1 > 0 ? depth - 1 : '';
10741078
emitter.emitln(`${carrier}[k${num}] = l${depth}`, this.level);
10751079
}
10761080
} else {
1077-
emitter.emitln(`if dict.keys.contains("${fieldName}") {`, this.level);
1081+
emitter.emitln(`if let value = dict["${fieldName}"] as? [Any?] {`, this.level);
10781082
this.levelUp();
10791083
emitter.emitln(`var tmp : [${this.emitType(type.itemType)}] = []`, this.level);
1080-
emitter.emitln(`for v in dict["${fieldName}"] as! [Any] {`, this.level);
1084+
emitter.emitln('for v in value {', this.level);
1085+
this.levelUp();
1086+
emitter.emitln('if v != nil {', this.level);
10811087
this.levelUp();
10821088
if (is.array(type.itemType) || is.map(type.itemType)) {
10831089
const propInfo = {
@@ -1092,7 +1098,7 @@ class Combinator extends CombinatorBase {
10921098
emitter.emitln(`var model = ${this.emitType(type.itemType)}()`, this.level);
10931099
emitter.emitln('if v != nil {', this.level);
10941100
this.levelUp();
1095-
emitter.emitln('model.fromMap(v as! [String: Any])', this.level);
1101+
emitter.emitln('model.fromMap(v as? [String: Any?])', this.level);
10961102
this.levelDown();
10971103
emitter.emitln('}', this.level);
10981104
emitter.emitln('tmp.append(model)', this.level);
@@ -1103,6 +1109,8 @@ class Combinator extends CombinatorBase {
11031109
}
11041110
this.levelDown();
11051111
emitter.emitln('}', this.level);
1112+
this.levelDown();
1113+
emitter.emitln('}', this.level);
11061114
emitter.emitln(`self.${_name(name)} = tmp`, this.level);
11071115
this.levelDown();
11081116
emitter.emitln('}', this.level);
@@ -1129,10 +1137,10 @@ class Combinator extends CombinatorBase {
11291137
emitter.emitln(`${carrier}[k${num}] = d${depth}`, this.level);
11301138
}
11311139
} else {
1132-
emitter.emitln(`if dict.keys.contains("${fieldName}") {`, this.level);
1140+
emitter.emitln(`if let value = dict["${fieldName}"] as? [String: Any?] {`, this.level);
11331141
this.levelUp();
11341142
emitter.emitln(`var tmp : [String: ${this.emitType(type.valType)}] = [:]`, this.level);
1135-
emitter.emitln(`for (k, v) in dict["${fieldName}"] as! [String: Any] {`, this.level);
1143+
emitter.emitln('for (k, v) in value {', this.level);
11361144
this.levelUp();
11371145
if (is.array(type.valType) || is.map(type.valType)) {
11381146
const propInfo = {
@@ -1147,7 +1155,7 @@ class Combinator extends CombinatorBase {
11471155
emitter.emitln('if v != nil {', this.level);
11481156
this.levelUp();
11491157
emitter.emitln(`var model = ${this.emitType(type.valType)}()`, this.level);
1150-
emitter.emitln('model.fromMap(v as! [String: Any])', this.level);
1158+
emitter.emitln('model.fromMap(v as? [String: Any?])', this.level);
11511159
emitter.emitln('tmp[k] = model', this.level);
11521160
this.levelDown();
11531161
emitter.emitln('}', this.level);
@@ -1168,15 +1176,15 @@ class Combinator extends CombinatorBase {
11681176
emitter.emitln(`var model = ${this.emitType(type)}()`, this.level);
11691177
emitter.emitln(`if ${name} != nil {`, this.level);
11701178
this.levelUp();
1171-
emitter.emitln(`model.fromMap(${name} as! [String: Any])`, this.level);
1179+
emitter.emitln(`model.fromMap(${name} as? [String: Any?])`, this.level);
11721180
this.levelDown();
11731181
emitter.emitln('}', this.level);
11741182
emitter.emitln(`l${num}.append(model)`, this.level);
11751183
} else if (is.map(parentType)) {
11761184
emitter.emitln(`if ${name} != nil {`, this.level);
11771185
this.levelUp();
11781186
emitter.emitln(`var model = ${this.emitType(type)}()`, this.level);
1179-
emitter.emitln(`model.fromMap(${name} as! [String: Any])`, this.level);
1187+
emitter.emitln(`model.fromMap(${name} as? [String: Any?])`, this.level);
11801188
emitter.emitln(`d${num}[k${num}] = model`, this.level);
11811189
this.levelDown();
11821190
emitter.emitln('}', this.level);
@@ -1186,8 +1194,9 @@ class Combinator extends CombinatorBase {
11861194
}
11871195

11881196
emitFromMap(emitter, modelName, props) {
1189-
emitter.emitln('public override func fromMap(_ dict: [String: Any]) -> Void {', this.level);
1197+
emitter.emitln('public override func fromMap(_ dict: [String: Any?]?) -> Void {', this.level);
11901198
this.levelUp();
1199+
emitter.emitln('guard let dict else { return }', this.level);
11911200
props.forEach(prop => {
11921201
let noteName = prop.notes.filter(item => item.key === 'name');
11931202
let name = noteName.length > 0 ? noteName[0].value : prop.name;
@@ -1204,21 +1213,24 @@ class Combinator extends CombinatorBase {
12041213
if (emt.needSave === true) {
12051214
emitter.emit(emt.output);
12061215
} else {
1207-
emitter.emitln(`if dict.keys.contains("${name}") {`, this.level);
1216+
emitter.emitln(`if let value = dict["${name}"] as? ${this.emitType(prop.type)} {`, this.level);
12081217
this.levelUp();
1209-
emitter.emitln(`self.${_name(prop.name)} = dict["${name}"] as! ${this.emitType(prop.type)}`, this.level);
1218+
emitter.emitln(`self.${_name(prop.name)} = value`, this.level);
12101219
this.levelDown();
12111220
emitter.emitln('}', this.level);
12121221
}
12131222
} else {
1214-
emitter.emitln(`if dict.keys.contains("${name}") {`, this.level);
1215-
this.levelUp();
1223+
12161224
if (is.object(prop.type) && prop.type.objectName && prop.type.objectName.indexOf('#') === 0) {
1225+
emitter.emitln(`if let value = dict["${name}"] as? [String: Any?] {`, this.level);
1226+
this.levelUp();
12171227
emitter.emitln(`var model = ${this.emitType(prop.type)}()`, this.level);
1218-
emitter.emitln(`model.fromMap(dict["${name}"] as! [String: Any])`, this.level);
1228+
emitter.emitln('model.fromMap(value)', this.level);
12191229
emitter.emitln(`self.${_name(prop.name)} = model`, this.level);
12201230
} else {
1221-
emitter.emitln(`self.${_name(prop.name)} = dict["${name}"] as! ${this.emitType(prop.type)}`, this.level);
1231+
emitter.emitln(`if let value = dict["${name}"] as? ${this.emitType(prop.type)} {`, this.level);
1232+
this.levelUp();
1233+
emitter.emitln(`self.${_name(prop.name)} = value`, this.level);
12221234
}
12231235
this.levelDown();
12241236
emitter.emitln('}', this.level);

tests/expected/annotation/Sources/Darabonba_Main/Models.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ public class Test : Tea.TeaModel {
2525
return map
2626
}
2727

28-
public override func fromMap(_ dict: [String: Any]) -> Void {
29-
if dict.keys.contains("test") {
30-
self.test = dict["test"] as! String
28+
public override func fromMap(_ dict: [String: Any?]?) -> Void {
29+
guard let dict else { return }
30+
if let value = dict["test"] as? String {
31+
self.test = value
3132
}
3233
}
3334
}

0 commit comments

Comments
 (0)