也许这对你们大多数人来说显然很简单,但是请你举一个例子,如何在 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/