你可以使用宏
#define debug_print(expr...) NSLog(@"%@ is %@", @#expr, (expr))
如您所见,NSLog 格式字符串需要一个 %@(对象),因此您需要使用整数的变体:
#define debug_printI(expr...) NSLog(@"%@ is %d", @#expr, (expr))
编辑:
有一种方法可以使用单个宏并使其适用于所有类型:使用 @encoding 查找类型。
NSString *print_debug_format_for_type(const char *encoding) {
switch (encoding[0]) {
case '@': return @"%@ is %@";
case '*': return @"%@ is %s";
case 'f': return @"%@ is %f";
case 'd': return @"%@ is %f";
case 'q': return @"%@ is %qi";
case 'Q': return @"%@ is %qu";
case 'c':
case 'i':
case 's':
default: return @"%@ is %d";
}
}
#define debug_print(expr...) ({ \
typedef __typeof__(expr) t; \
NSLog(print_debug_format_for_type(@encode(t)), @#expr, (expr)); \
})
有了这个,你可以在任何地方使用(几乎)任何类型的 debug_print,只要它在 print_debug_format_for_type 中。传入的编码(来自@encode)可以在这里找到[apple docs],格式字符串的格式可以在这里找到[also apple docs]。照原样,这适用于任何对象、c 样式字符串、整数、浮点数或双精度表达式。
(小警告:ObjC BOOL 类型实际上是一个 typedef'd char,所以如果你 print_debug 一个布尔表达式,它会说它是 1 或 0。虽然这有效,它也意味着如果你 print_debug 一个 char 表达式,它会说它是字符的 ascii 号。要改变这种行为(并中断 BOOL 打印),请将 case 'c' 更改为return @"%@ is %c"
.