Элегантно замените несколько токенов в URL / NSString - PullRequest
1 голос
/ 05 января 2012

Когда я общаюсь со своим бэкэндом, у меня часто бывает такой URL-адрес:

http://myserver.com/api/endpoint?param1={PARAM1}&param2={PARAM2}

Поэтому, прежде чем отправлять запрос, мне нужно заменить эти параметры на действительные значения.Итак, фрагменты кода, подобные приведенному ниже, повсюду в моем коде:

myString = [[[uriString  stringByReplacingOccurrencesOfString:@"{PARAM1}" withString:@"..."]
              stringByReplacingOccurrencesOfString:@"{PARAM2}" withString:@"..."]
             stringByReplacingOccurrencesOfString:@"{PARAMn}" withString:@"..."];

Сейчас я ищу элегантный способ замены этих параметров и могу придумать несколько вариантов:

  1. Создайте категорию NSString:

    [myString replaceOccurencesOfStrings:@"{PARAM1}",@"{PARAM2}",nil withStrings @"value1",@"value2",nil];
    
  2. Создайте Util, который работает так же, как в примере выше, только я передаю ему строку

  3. Тот же подход, что и 1. и 2., но с использованием NSDictionary со значением ключа, подобным этому: 'PARAM1' -> 'value1' ...

Какой самый эффективный и элегантный способдостичь этого

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Попробуйте использовать [NSString stringWithFormat]:

myString = [NSString stringWithFormat:@"http://myserver.com/api/endpoint?param1=%@&param2=%@", @"valueOfParam1", @"valueOfParam2"];
2 голосов
/ 05 января 2012

Однажды у меня был проект, в котором я добавил категорию к NSString, которая делает что-то вроде этого:

@implementation NSString (Interpolate)

#define COPYREGION(_endp)                                               \
    do                                                                  \
    {                                                                   \
        NSUInteger _pointer = _endp;                                    \
        NSRange _range = NSMakeRange(lastPoint, _pointer - lastPoint);  \
        NSString* _region = [self substringWithRange: _range];          \
        [buffer appendString: _region];                                 \
    }                                                                   \
    while (0)

- (void) appendTo: (NSMutableString*) buffer byInterpolating: (NSDictionary*) variables
{
    NSUInteger length = [self length];
    NSUInteger p = 0;
    NSUInteger lastPoint = 0;

    while (p < length)
    {
        unichar ch = [self characterAtIndex: p];
        if (ch != '$') ++p;
        else
        {
            COPYREGION(p);
            NSUInteger start = ++p;
            while (p < length && [self characterAtIndex: p] != '$') ++p;

            if (p == length) NSLog(@"Warning: missing closing '$' in substitution marker");
            if (p == start + 1) [buffer appendString: @"$"];
            else
            {
                NSRange range = NSMakeRange(start, p - start);
                NSString* name = [self substringWithRange: range];
                NSString* value = [variables objectForKey: name];
                if (value) [buffer appendString: value];
            }
            lastPoint = ++p;
        }
    }

    COPYREGION(length);
}

- (NSString*) stringByInterpolating: (NSDictionary*) variables
{
    NSAutoreleasePool* pool = [NSAutoreleasePool new];
    NSMutableString* buffer = [NSMutableString string];

    [self appendTo: buffer byInterpolating: variables];

    NSString* answer = [buffer copy];
    [pool release];
    return [answer autorelease];
}

@end

Синтаксис для переменных подстановки: $name$.Вхождение $$ становится символом в один доллар.Использование будет:

NSDictionary* subst = [NSDictionary dictionaryWithObjectsAndKeys: @"param1", @"p1", @"param2", @"p2", nil];
return [@"Some template param1=$p1$, param2=$p1$" stringByInterpolating: subst];
1 голос
/ 05 января 2012

Зачем заменять токены, если вы можете просто использовать формат, например, используя stringByAppendingFormat .

Интерфейс для функции будет:

-(NSString*) createRequestToURL:(NSString*) url_string withParams:(NSDictionary*) params {
//TODO:
}

Где ключв словаре есть имя параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...