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

Posted

技术标签:

【中文标题】如何创建一个直接接受带有格式的字符串作为参数的方法?【英文标题】:How to create a method which accepts strings with format directly as argument? 【发布时间】:2012-07-04 23:35:24 【问题描述】:

我不知道该如何提出这个问题。 我想创建一个像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];

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

【问题讨论】:

【参考方案1】:

使用可变参数宏 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

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

【讨论】:

你能解释一下可变参数宏吗?我对 Objective-c 很陌生。 @Rakesh Varargs 不是 Objective-C,它们是 C。请参阅此页面:eskimo.com/~scs/cclass/int/sx11b.html 以上应该是 [NSString stringWithFormat:reason, va] 而不是列出“参数”位吗?否则我无法编译它。不过谢谢! @TheSenator 你是对的;它应该是initWithFormat:arguments:。我现在已经修好了;谢谢。【参考方案2】:

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

-(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);

【讨论】:

以上是关于如何创建一个直接接受带有格式的字符串作为参数的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个接受多个 lambda 表达式作为参数的方法?

如何将字符串向量传递给execv

带有 casbah 的 scala 案例类。接受 objectid 参数作为字符串或 objectid

如何使用格式说明符创建字符串? [复制]

如何创建一个从管道和命令行接受多种参数类型的函数?

如何创建一个从代码中获取参数并返回字符串的函数?