【问题标题】: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];

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

【问题讨论】:

    标签: objective-c string cocoa methods format


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-30
      • 2019-03-19
      • 2021-02-16
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多