Objective-C query string builder and parser

Objective-C
#import <Foundation/Foundation.h>

static NSString *BuildQuery(NSDictionary<NSString *, NSString *> *params) {
    NSMutableCharacterSet *allowed = [NSCharacterSet.URLQueryAllowedCharacterSet mutableCopy];
    [allowed removeCharactersInString:@"&=+?"]; // keep separators out of values
    NSMutableArray<NSString *> *pairs = [NSMutableArray array];
    [params enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
        [pairs addObject:[NSString stringWithFormat:@"%@=%@", [key stringByAddingPercentEncodingWithAllowedCharacters:allowed], [value stringByAddingPercentEncodingWithAllowedCharacters:allowed]]];
    }];
    return [pairs componentsJoinedByString:@"&"];
}

static NSDictionary<NSString *, NSString *> *ParseQuery(NSString *query) {
    NSMutableDictionary *out = [NSMutableDictionary dictionary];
    for (NSString *pair in [query componentsSeparatedByString:@"&"]) {
        NSArray *kv = [pair componentsSeparatedByString:@"="];
        NSString *key = [kv.firstObject stringByRemovingPercentEncoding] ?: kv.firstObject;
        NSString *value = kv.count > 1 ? [kv[1] stringByRemovingPercentEncoding] : @"";
        if (key.length) out[key] = value ?: @"";
    }
    return out;
}