5

我不知道该怎么问这个问题。我想创建一个类似stringWithFormat:or的方法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];

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

4

2 回答 2

11

使用可变参数宏va_start,va_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
}

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

于 2012-07-04T12:57:08.097 回答
5

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

-(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);
}
于 2012-07-04T12:58:06.703 回答