Ответ 1
То, что они называются, как правило, это "вариативные функции" (или как бы методы).
Чтобы создать это, просто запустите свой метод declartion с помощью , ...
, как в
- (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 *, ...);
vs 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 имеет nil-terminated.
Примечание.. Чтобы выполнить эту работу, вам может потребоваться включить <stdarg.h>
; но если память служит, это включается в связь с NSLogv, то есть это происходит с помощью "Foundation.h", поэтому также "AppKit.h" и "Cocoa.h", а также ряд других; поэтому это должно работать из коробки.