【问题标题】:Defining methods with NSString with format使用带有格式的 NSString 定义方法
【发布时间】:2012-10-18 21:47:54
【问题描述】:

你如何在你自己的类中定义一个接受带有格式的 NSString 的方法?

我看到几个不同的东西在使用它,比如NSLog[NSPredicate predicateWithFormat:(NSString *)predicateFormat, ...],当然还有[NSString stringWithFormat:(NSString *)format, ...]

另外,在头文件中,NSLog 和 stringWithFormat 在声明后有以下内容: NS_FORMAT_FUNCTION(1,2)。谷歌搜索并不能告诉我这意味着什么。

显然省略号是格式参数,但我不知道如何在方法本身中处理它们。

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    你需要使用一些 C 代码:

    - (void)someMethod:(NSString *)format,... {
        va_list argList;
        va_start(argList, format);
        while (format) {
            // do something with format which now has next argument value
            format = va_arg(argList, id);
        }
        va_end(argList);
    }
    

    并且可以将参数转发到NSString,如下所示:

    - (void)someMethod:(NSString *)format,... {
        va_list args;
        va_start(args, format);
        NSString *msg = [[NSString alloc] initWithFormat:format arguments:args];
        va_end(args);
    }
    

    【讨论】:

      【解决方案2】:

      您正在寻找具有可变数量参数的 Objective-C 方法。这是如何完成的:

      标题中的声明:

      - (void)setContentByAppendingStrings:(NSString *)firstString, ... 
         NS_REQUIRES_NIL_TERMINATION;
      

      实施:

      - (void)setContentByAppendingStrings:(NSString *)firstArg, ...
      {
          NSMutableString *newContentString = [NSMutableString string];
      
          va_list args;
          va_start(args, firstArg);
          for (NSString *arg = firstArg; arg != nil; arg = va_arg(args, NSString*))
          {
              [newContentString appendString:arg];
          }
          va_end(args);
      
          contents = newContentString;
      }
      

      来源:Cocoa With Love

      【讨论】:

      • NS_FORMAT_FUNCTION 宏已经取代了 NS_REQUIRES_NIL_TERMINATION 的这种特定用途(用于具有任意变量参数的格式字符串)。
      • NS_FORMAT_FUNCTION 需要 2 个参数。第一个是格式字符串的索引,第二个是'...'的索引。所以在这个例子中 + (id)errorWithCode:(NSInteger)code format:(NSString *)format, ... NS_FORMAT_FUNCTION(2,3); 2是格式,3是...
      • 感谢@malhal,一直在到处寻找这个简单的解释。无处可好。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      相关资源
      最近更新 更多