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

提醒一下:

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

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

推荐答案

这些通常被称为"可变函数"(或方法).

要创建这个,只需end你的方法用, ...宣布,如

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

在这一点上,您可能希望将其封装在一个类似printf的函数中,因为从零开始实现这些函数中的一个充其量只是在try .

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

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


另一方面,如果你不是在使用字符串,而是类似于

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

事情变得容易多了.

在这种情况下,不要使用vprintf样式的函数,而是使用一个通过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列表以零结尾.

Note:为了完成这项工作,你必须包括<stdarg.h>;但是,如果内存可用,它会被包括在NSLogv中,这意味着它是通过"Foundation.h"来实现的,因此也包括"AppKit.h"和"Cocoa.h",以及其他一些;所以这应该是现成的.

Objective-c相关问答推荐

iPhone SDK 网络连接检测

如何测试 NSCFBolean 值?

定义缓存变量时在objective-c中使用static关键字

NSFileManager 唯一的文件名

增加推送通知徽章 iPhone

在Objective-C中从类名的NSString创建对象

如何编写 OS X Finder 插件

从 UIImage 获取 Exif 数据 - UIImagePickerController

自定义导航栏样式 - iOS

iOS是静态框架还是动态框架?

在 UITextField 文本上投影

UIDatePicker 中的最小和最大日期

如何以编程方式在 UINavigationController 中按下返回按钮

如何在 Objective-C 中添加具有自己的 UIViewController 的子视图?

如何在 xcode 项目中启用/禁用 ARC?

UIImage上的圆角

Objective-c - CABasicAnimation 在动画后应用更改?

iPhone如何在打字时获取UITextField的文本?

更改 UITextField 占位符字体

如何将按钮放在不会在 iOS 中随表格滚动的 UITableView 上