如何创建一个接受带格式的字符串作为参数的方法?

时间:2012-07-04 12:51:30

标签: objective-c string cocoa methods format

我不知道如何提出这个问题。 我想创建一个类似stringWithFormat:predicateWithFormat:的方法,即我的方法直接接受参数作为带有格式说明符的字符串。我怎样才能做到这一点?

如,

-(void) someMethod: (NSString *)str, format; 

以后我可以这样称呼它:

[someObject someMethod:@"String with format %@",anotherString];

这与任何特定背景无关。

我正在使用类似于以下代码的工作predicateWithFormat

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like myName"];

这不起作用,但是:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like 'myName'"];

的工作方式类似于:

NSString *str = @"myName";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",str];

因此,这意味着该方法能够理解给定的参数是否具有在其中使用的格式说明符。我很好奇如何才能做到这一点?

2 个答案:

答案 0 :(得分:11)

使用varargs宏va_startva_end等:

-(void) someMethod: (NSString *)fmt, ...
{
    va_list va;
    va_start(va, fmt);    
    NSString *string = [[NSString alloc] initWithFormat:fmt
                                              arguments:va];
    va_end(va);

    // Do thing with string
}

要记住的重要一点是vararg参数会丢失其类型,因此像printf()[NSString stringWithFormat]这样的函数会使用格式字符串来帮助确定有多少个参数以及每个参数应该如何解释。如果您需要不同的语义,那么您需要提供一些信息。

答案 1 :(得分:4)

您正在寻找具有可变数量参数的方法。方法需要像这样声明:

-(void) someMethod: (NSString *)str, ...; // Yes, three dots

在方法内部,您可以使用宏逐个提取参数。第一个参数需要提供足够的信息来告知传递了多少其他参数。例如,stringWithFormat可以通过计算未转义的%格式说明符来判断传递了多少参数。

- (void) someMethod:NSString *)str, ... {
    va_list args;
    va_start(args, str);
    int some_count = /* figure out how many args there are */;
    for( int i = 0; i < some_count; i++ ) {
        value = va_arg(args, <some_type>); // You need to derive the type from the format as well
    }
    va_end(args);
}