Skip to content

Instantly share code, notes, and snippets.

@virasio
Last active August 29, 2015 13:58
Show Gist options
  • Save virasio/10253030 to your computer and use it in GitHub Desktop.
Save virasio/10253030 to your computer and use it in GitHub Desktop.
NSURL+Dictionaries — Returns properties query and fragment of NSURL as NSDictionary
@interface NSURL (Dictionaries)
@property (nonatomic, readonly) NSDictionary *queryDictionary;
@property (nonatomic, readonly) NSDictionary *fragmentDictionary;
- (NSURL *)URLByAppendingQueryParameters:(NSDictionary *)parameters;
@end
#import "NSURL+Dictionaries.h"
@implementation NSURL (Dictionaries)
- (NSDictionary *)parseParametersString:(NSString *)parametersString {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSArray *parameters = [parametersString componentsSeparatedByString:@"&"];
for (NSString *parameter in parameters) {
NSArray *parts = [parameter componentsSeparatedByString:@"="];
NSString *key = [[parts objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if ([parts count] > 1)
{
id value = [[parts objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[dict setObject:value forKey:key];
}
}
return [NSDictionary dictionaryWithDictionary:dict];
}
- (NSDictionary *)queryDictionary {
return [self parseParametersString:self.query];
}
- (NSDictionary *)fragmentDictionary {
return [self parseParametersString:self.fragment];
}
- (NSURL *)URLByAppendingQueryParameters:(NSDictionary *)parameters {
if (!parameters || parameters.count == 0) {
return [self copy];
}
NSMutableString *queryString = [NSMutableString stringWithString:@""];
for (NSString *key in parameters) {
[queryString appendString:[NSString stringWithFormat:@"%@%@=%@",
([queryString isEmpty] ? @"" : @"&"), key, parameters[key]]];
}
NSString *URLString = [[NSString alloc] initWithFormat:@"%@%@%@", [self absoluteString],
[self query] ? @"&" : @"?", queryString];
return [NSURL URLWithString:URLString];
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment