我想擴展NSLog,可以打印任何類型的對象。意思是,我的自定義類獲取需要從用戶打印的值並檢查其類的類型,然後將其打印爲期望的格式。自定義NSLog打印所有類型的對象
考慮我的擴展類的名字,MyLog
(所以它包含MyLog.h
和MyLog.m
)
MyLog.h:
void MyLog (id objectValue);
MyLog.m:
#import "MyLog.h"
void MyLog (id objectValue)
{
if ([objectValue isKindOfClass:[NSString class]])
{
NSLog(@"%@",objectValue); //Same for NSArray, NSDictionary, NSMutableArray, NSMutableDictionary
}
else if ([objectValue isKindOfClass:[NSData class]])
{
NSLog(@"%@",[[NSString alloc]initWithData:objectValue encoding:NSUTF8StringEncoding]);
}
....
....
}
所以,如果我包含這個類(MyLog.h
)在前綴文件中,我可以從任何類調用下面的方法來簡單地打印給定的對象。
MyLog(valueOfObject);
問題:
的
CGRect
,CGpoint
,CGSize
相關的東西(不是一個對象)不能傳遞如id
到MyLog()
功能。我試圖打印對象名稱及其值以提高可讀性。請參閱post。
例如,
NSString *myString = @"Welcome";
MyLog(myString);
這將打印myString: Welcome
,而不是隻打印Welcome
。
我能實現這個我定義諸如
#define MYLOG(x) NSLog(@"%s:%@",#x, x)
一個預處理所以,我試圖來定製它以下列方式
#define MYLOG(x) NSLog(@"%s:%@",#x, MyLog(x))
但它拋出「Argument type 'void' is incomplete
」的錯誤。
問題:
- 如何傳遞非對象爲ID的功能?
- 如何在預處理器宏中調用函數?
需要幫助!只是困惑!
這是我的問題1的答案? – Confused
這不是直接回答你的問題,而是關於如何更簡單的建議。沒有必要創建你自己的NSLog。如果你願意,我可以告訴你如何爲你的確切函數編寫代碼,但我真的建議不要這樣做,因爲你已經有了一個完美的解決方案。 –
當你傳入一個對象到NSLog中時,調用'description'方法。所以你所要做的就是確保你在課堂上實現它。 –