iOS 使用宏打印变量名字
Posted 想名真难
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 使用宏打印变量名字相关的知识,希望对你有一定的参考价值。
今天看代码发现一个宏, 竟然还是有点意思的. 这个宏可以把入参的变量名称打印出来,
比如入参一个string类型的字符串, 变量名叫 studentName = @"小明", 通过这个宏可以打印出studentName.
#define HTLog(_var) \\
\\
NSString *name = @#_var; \\
NSLog(@"变量名:%@; 变量值:%@; 变量地址:%p; 变量类型:%@", name, _var, _var, [_var class]); \\
// -----------------
NSString *studentName = @"小明";
HTLog(studentName);
控制台输出:
变量名:studentName; 变量值:小明; 变量地址:0x10cf2f340; 变量类型:__NSCFConstantString
NSNumber *number1 = @1;
HTLog(number1);
控制台输出:
变量名:number1; 变量值:1; 变量地址:0xb000000000000012; 变量类型:__NSCFNumber
为什么经过@#之后就可以获取到变量名称了?? 我在代码中直接写@#就要给我报错了, 看来问题可能出在是宏的原因.
一个 # 号
表示加双引号
#define kToString(x) #x
kToString(123) 等价于 "123"
显然,这个一个C字符串
要想变成OC的字符串
还需要改进一下:
#define kToString(x) @#x
两个 ## 号
表示连接
#define kConnect(x,y) x##y
kConnect(123,456) 等价于 123456
这个在看MAS源码的时候看到了一个具体的例子
好了, 有了这些奇怪的知识, 就可以做到传入一个变量, 打印出变量对应的名字.
比如在KVC/KVO的时候 需要使用字符串做一些硬编码, 后期修改变量名可能会导致KVC/KVO失效, 而使用这样获取字符串, 如果发生修改变量名, 编译器会直接报错, 提前发现硬编码导致的问题.
#define GCSToString(_var) \\
(NSString *)^(void) \\
NSString *name = @#_var; \\
return name;\\
()
#define GCSVarToStringAndValue(_var) \\
(NSString *)^(void) \\
NSString *name = @#_var; \\
name = [name stringByAppendingFormat:@":%@",_var];\\
return name;\\
()
// -------
NSString *key = GCSToString(studentName);
NSLog(@"%@",key);
控制台输出:
studentName
构造了一个block, 返回值是一个NSString, 然后立即调用这个block获得返回值.
以上是关于iOS 使用宏打印变量名字的主要内容,如果未能解决你的问题,请参考以下文章