@@ -12,6 +12,13 @@ @interface NSString (CMDQueryStringSerialization)
1212
1313- (NSString *)cmd_stringByAddingEscapes ;
1414- (NSString *)cmd_stringByRemovingEscapes ;
15+ - (void )cmd_enumeratePairs : (void (^) (NSString *key, NSString *value))block ;
16+
17+ @end
18+
19+ @interface NSMutableDictionary (CMDQueryStringSerialization)
20+
21+ - (void )cmd_addObject : (id )object forKey : (NSString *)key ;
1522
1623@end
1724
@@ -21,49 +28,10 @@ + (NSDictionary *)dictionaryWithQueryString:(NSString *)string {
2128 if (!string) {
2229 return nil ;
2330 }
24-
2531 NSMutableDictionary *result = [NSMutableDictionary new ];
26- NSArray *pairs = [string componentsSeparatedByString: @" &" ];
27-
28- for (NSString *pair in pairs) {
29- if ([pair length ] == 0 ) {
30- continue ;
31- }
32-
33- NSRange range = [pair rangeOfString: @" =" ];
34- NSString *key;
35- NSString *value;
36-
37- if (range.location == NSNotFound ) {
38- key = [pair cmd_stringByRemovingEscapes ];
39- value = @" " ;
40- } else {
41- key = [pair substringToIndex: range.location];
42- key = [key cmd_stringByRemovingEscapes ];
43-
44- value = [pair substringFromIndex: (range.location + range.length)];
45- value = [value cmd_stringByRemovingEscapes ];
46- }
47-
48- if (!key || !value) {
49- continue ;
50- }
51-
52- id existingValueForKey = result[key];
53-
54- if (existingValueForKey) {
55- result[key] = ^{
56- if ([existingValueForKey isKindOfClass: [NSArray class ]]) {
57- return [existingValueForKey arrayByAddingObject: value];
58- } else {
59- return @[existingValueForKey, value];
60- }
61- }();
62- } else {
63- result[key] = value;
64- }
65- }
66-
32+ [string cmd_enumeratePairs: ^(NSString *key, NSString *value) {
33+ [result cmd_addObject: value forKey: key];
34+ }];
6735 return result;
6836}
6937
@@ -105,4 +73,42 @@ - (NSString *)cmd_stringByRemovingEscapes {
10573 return [self stringByRemovingPercentEncoding ];
10674}
10775
76+
77+ - (void )cmd_enumeratePairs : (void (^) (NSString *key, NSString *value))block {
78+ NSArray *pairs = [self componentsSeparatedByString: @" &" ];
79+ [pairs enumerateObjectsUsingBlock: ^(NSString *pair, NSUInteger index, BOOL *stop) {
80+ NSRange range = [pair rangeOfString: @" =" ];
81+ NSString *key, *value;
82+ if (range.location == NSNotFound ) {
83+ key = [pair cmd_stringByRemovingEscapes ];
84+ value = @" " ;
85+ } else {
86+ key = [pair substringToIndex: range.location];
87+ key = [key cmd_stringByRemovingEscapes ];
88+ value = [pair substringFromIndex: (range.location + range.length)];
89+ value = [value cmd_stringByRemovingEscapes ];
90+ }
91+ block (key, value);
92+ }];
93+ }
94+
95+ @end
96+
97+ @implementation NSMutableDictionary (CMDQueryStringSerialization)
98+
99+ - (void )cmd_addObject : (id )object forKey : (NSString *)key {
100+ id existingObject = self[key];
101+ if (existingObject) {
102+ if ([existingObject isKindOfClass: [NSArray class ]]) {
103+ self[key] = [existingObject arrayByAddingObject: object];
104+ }
105+ else {
106+ self[key] = @[ existingObject, object ];
107+ }
108+ }
109+ else {
110+ self[key] = object;
111+ }
112+ }
113+
108114@end
0 commit comments