Однажды у меня был проект, в котором я добавил категорию к 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];