То, что они называются, как правило, это "функции с переменными числами" (или как бы методы).
Чтобы создать это, просто end ваше объявление метода с , ...
,как в
- (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:
on NSString *
.
Если, с другой стороны, вы работаете не со строками, а с чем-то вроде
+ (NSArray *)arrayWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION;
, все становится намного проще.
В этом случае вместо функции в стиле vprintf
используйте цикл, проходящий через args
, принимая идентификатор по ходу, и анализируйте их, как в любом цикле.
- (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», а также ряд других;так что это должно работать из коробки.