這已被問過,但我沒有得到我的頭。我有我自己的屏幕記錄器,它有一個方法「追加」,它應該像NSLog一樣工作,並帶有多個參數。如何在NSLog等方法中處理多個參數?
因此,而不是寫這個:
int mynum = 19;
NSLog(@"This is a number %d",mynum);
我想這樣做:
[Logger append:@"This is a number %d",mynum];
任何想法我怎麼能做到這一點?
感謝
這已被問過,但我沒有得到我的頭。我有我自己的屏幕記錄器,它有一個方法「追加」,它應該像NSLog一樣工作,並帶有多個參數。如何在NSLog等方法中處理多個參數?
因此,而不是寫這個:
int mynum = 19;
NSLog(@"This is a number %d",mynum);
我想這樣做:
[Logger append:@"This is a number %d",mynum];
任何想法我怎麼能做到這一點?
感謝
好的,這是困難的方法。 :-)
使用STDARG.H宏來創建你的附加參數的va_list副本,然後創建一個字符串,使用-initWithFormat:arguments:
方法:
-(void) append:(NSString*)format, ... {
va_list args, args_copy;
va_start(args, format);
va_copy(args_copy, args);
va_end(args);
NSString *logString = [[NSString alloc] initWithFormat:format
arguments:args_copy];
// Append logString to your logger
va_end(args_copy);
[logString release];
}
這種方式給你的所有靈活性NSLog()本身,支持任何數量和類型的參數。
[Logger append:[NSString stringWithFormat:@"This is a number %d",mynum]];
你想要一個省略號,例如
-(SomeResult*)append:(id)object,... {
id obj;
va_list argumentList;
va_start(argumentList, obj);
while (obj = va_arg(argumentList, id)) // Do something with obj
va_end(argumentList);
// ...
}
請注意,如果你只是想做像你說的那樣的日誌記錄,說@Terente解決方案更好 – vickirk 2011-04-20 10:13:41
關閉,但不完全。 :-) Stdarg宏是這樣做的方式,但您的示例僅支持對象參數,並且需要在參數列表末尾有一個零哨兵,而不是使用格式字符串。你也沒有使用va_start()很對 - 它應該是'va_start(argumentList,object)'。 – 2011-04-20 12:28:48
@Sherm,好點,在我的辯護中,我只是提供了使用可變參數函數的介紹,當然不打算產生一些功能代碼。 (雖然指出了這一點) – vickirk 2011-04-20 12:47:17
好吧,是的,這將是簡單的方法;)但是,因爲我在這個話題上,我真的很想嘗試一下。 – eemceebee 2011-04-20 12:09:06