2015-04-27 34 views
0

我想擴展NSLog,可以打印任何類型的對象。意思是,我的自定義類獲取需要從用戶打印的值並檢查其類的類型,然後將其打印爲期望的格式。自定義NSLog打印所有類型的對象

考慮我的擴展類的名字,MyLog(所以它包含MyLog.hMyLog.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); 

問題:

  • CGRectCGpointCGSize相關的東西(不是一個對象)不能傳遞如idMyLog()功能。

  • 我試圖打印對象名稱及其值以提高可讀性。請參閱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的功能?
  • 如何在預處理器宏中調用函數?

需要幫助!只是困惑!

回答

0

如果您實施-(NSString*)description,您可以使用NSLog(@"%@", myObject)在NSLog中打印任何對象。

因此,只需在要打印的對象類中添加-(NSString*)description,並在其中返回您認爲與該對象相關的NSString值。

+0

這是我的問題1的答案? – Confused

+0

這不是直接回答你的問題,而是關於如何更簡單的建議。沒有必要創建你自己的NSLog。如果你願意,我可以告訴你如何爲你的確切函數編寫代碼,但我真的建議不要這樣做,因爲你已經有了一個完美的解決方案。 –

+0

當你傳入一個對象到NSLog中時,調用'description'方法。所以你所要做的就是確保你在課堂上實現它。 –