自定义NSLog以打印所有类型的对象

时间:2015-04-27 19:54:28

标签: ios macros custom-controls parameter-passing 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相关内容(不是对象)无法作为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 个答案:

答案 0 :(得分:0)

如果您实施-(NSString*)description,则可以使用NSLog(@"%@", myObject)打印NSLog中的任何对象。

因此,只需在要打印的对象类中添加-(NSString*)description,然后只返回您认为与该对象相关的NSString值。