2012-01-05 13 views
1

URLで複数のトークンを交換してください。したがって、次のようなコード断片はすべて私のコードの上にある:は、エレガントな、私は多くの場合、このようなURLを持っている/ NSStringの

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

は、私は今、これらのparamsを置換するエレガントな方法を探していますし、私はいくつかのオプションを考えることができます。

  1. カテゴリを作りますNSStringのの:

    [myString replaceOccurencesOfStrings:@"{PARAM1}",@"{PARAM2}",nil withStrings @"value1",@"value2",nil]; 
    
  2. 私はそれを文字列を渡すだけで、上記の例と同じように動作しますUtilのを確認し

  3. 1.2.と同じアプローチが、このようなキーの値をNSDictionaryのを使用して:'PARAM1' -> 'value1' ...

はあなただけ使用できるかどうか、なぜトークンを置き換えるこの

答えて

1

を達成するための最も効率的かつエレガントな方法は何ですかフォーマットは、例えばstringByAppendingFormatを使用します。

機能のためのインタフェースは、次のようになります。

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

辞書内のキーはのparam名前です。

+0

私は名前付きパラメータでURLを持っているので、パラメータの順序を調べなくても置き換えることができます。 – Besi

2

[NSString stringWithFormat]を使用してみてください:

@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$です:

myString = [NSString stringWithFormat:@"http://myserver.com/api/endpoint?param1=%@&param2=%@", @"valueOfParam1", @"valueOfParam2"]; 
+0

これは悪い考えではありませんが、私はパラメータの名前を持っているので、順序は問題ではなく、変更することができます。 – Besi

2

私はかつて、私はこのような何かをしているNSStringにカテゴリを追加したプロジェクトを持っていました。 $$の出現は単一ドル文字になります。使用方法:

NSDictionary* subst = [NSDictionary dictionaryWithObjectsAndKeys: @"param1", @"p1", @"param2", @"p2", nil]; 
return [@"Some template param1=$p1$, param2=$p1$" stringByInterpolating: subst]; 
関連する問題