@@ -318,14 +318,35 @@ - (id)mergeHelper:(id)vars withDiffs:(id)diff
318318 for (id var in vars) {
319319 [merged addObject: var];
320320 }
321- for (id varSubscript in diff) {
322- int subscript = [[varSubscript substringWithRange: NSMakeRange (1 , [varSubscript length ] - 2 )] intValue ];
323- id var = [diff objectForKey: varSubscript];
324- while (subscript >= [merged count ]) {
325- [merged addObject: [NSNull null ]];
321+
322+ // Merge values from server
323+ // Array values from server come as Dictionary
324+ // Example:
325+ // string[] items = new string[] { "Item 1", "Item 2"};
326+ // args.With<string[]>("Items", items); // Action Context arg value
327+ // "vars": {
328+ // "Items": {
329+ // "[1]": "Item 222", // Modified value from server
330+ // "[0]": "Item 111" // Modified value from server
331+ // }
332+ // }
333+ // Prevent crashing when loading variable diffs where the diff is an Array and not Dictionary
334+ if ([diff isKindOfClass: NSDictionary .class]) {
335+ for (id varSubscript in diff) {
336+ // Get the index from the string key: "[0]" -> 0
337+ if ([varSubscript isKindOfClass: NSString .class]) {
338+ NSString *varSubscriptStr = (NSString *)varSubscript;
339+ if ([varSubscriptStr length ] > 2 && [varSubscriptStr hasPrefix: @" [" ] && [varSubscriptStr hasSuffix: @" ]" ]) {
340+ int subscript = [[varSubscriptStr substringWithRange: NSMakeRange (1 , [varSubscriptStr length ] - 2 )] intValue ];
341+ id var = [diff objectForKey: varSubscriptStr];
342+ while (subscript >= [merged count ]) {
343+ [merged addObject: [NSNull null ]];
344+ }
345+ [merged replaceObjectAtIndex: subscript
346+ withObject: [self mergeHelper: merged[subscript] withDiffs: var]];
347+ }
348+ }
326349 }
327- [merged replaceObjectAtIndex: subscript
328- withObject: [self mergeHelper: merged[subscript] withDiffs: var]];
329350 }
330351 return merged;
331352 }
0 commit comments