objective-c - 如何在 Objective-C 中创建可变参数方法

标签 objective-c xcode format variadic-functions null

也许这对你们大多数人来说显然很简单,但是请你举一个例子,如何在 C 中创建类似的方法(在 Objective-C 中)和函数来创建像 NSString 的函数stringWithFormat:NSLog().

提醒一下:

[NSString stringWithFormat:@"example tekst %i %@ %.2f", 122, @"sth", 3.1415"];
NSLog(@"account ID %i email %@", accountID, email);

我想创建类似于 NSString 的方法 stringWithFormat:, NSURL - urlWithFormat

最佳答案

这些通常被称为“可变参数函数”(或称方法)。

要创建它,只需使用 , ...结束您的方法声明, 如

- (void)logMessage:(NSString *)message, ...;

此时您可能希望将其包装在 printf 中。类似的功能,因为从头开始实现其中一个是尝试,充其量。

- (void)logMessage:(NSString *)format, ... {
  va_list args;
  va_start(args, format);
  NSLogv(format, args);
  va_end(args);
}

注意 NSLogv 的使用而不是 NSLog ;考虑NSLog(NSString *, ...);NSLogv(NSString *, va_list); ,或者如果你想要一个字符串; initWithFormat:arguments:NSString * .


另一方面,如果您使用的不是字符串,而是类似

+ (NSArray *)arrayWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION;

事情变得容易多了。

在这种情况下,而不是 vprintf -style 函数,使用循环 args , 假设你走的时候是 id,然后像在任何循环中一样解析它们。

- (void)logMessage:(NSString *)format, ... {
  va_list args;
  va_start(args, format);

  id arg = nil;
  while ((arg = va_arg(args,id))) {
  /// Do your thing with arg here
  }

  va_end(args);
}

当然,最后一个示例假定 va_args 列表是零终止的。

注意:为了完成这项工作,您可能必须包含 <stdarg.h> ;但是如果没记错的话,这会与 NSLogv 一起包含,这意味着它会通过“Foundation.h”,因此也包括“AppKit.h”和“Cocoa.h”以及其他一些方式而下降;所以这应该是开箱即用的。

关于objective-c - 如何在 Objective-C 中创建可变参数方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4804674/

相关文章:

java - 按列打印 Java 数组

java - 填充 JTextField 时丢失 "next line"格式

objective-c - 撤消/重做菜单项从未启用

iphone - 可接受的滚动 FPS 是多少?提高性能的技巧是什么?

objective-c - 如何在 UITableView 部分标题中进行文本换行或滚动?

iphone - 提交后更改应用程序的屏幕截图

ios - TestFlight Beta 应用程序审查

Objective-c 重构,代码归属于哪里?

ios - 加载 View 后隐藏 subview 图像(使用 Swift)

javascript - 如何使用 JavaScript 格式化日期?