是否有可能NSLog C结构(如CGRect或CGPoint)?

我希望能够调试C结构,而不必显式地键入它们所包含的每个属性。

例如,我希望能够做这样的事情:

CGPoint cgPoint = CGPointMake(0,0);
NSLog(@"%@",cgPoint);

显然'%@'不起作用,因此出现了这个问题。

108141 次浏览

你可以试试这个:

NSLog(@"%@", NSStringFromCGPoint(cgPoint));

有许多函数由UIKit提供可以将各种CG结构体转换为__abc0。它不起作用的原因是因为%@表示一个对象。CGPoint是一个C结构体(CGRects和__abc4也是)。

我使用下面的宏来帮助我用NSRect:

#define LogRect(RECT) NSLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f",
#RECT, RECT.origin.x, RECT.origin.y, RECT.size.width, RECT.size.height)

你可以为CGPoint做类似的事情:

@define LogCGPoint(POINT) NSLog(@"%s: (%0.0f, %0.0f)",
#POINT POINT.x, POINT.y);

使用方法如下:

LogCGPoint(cgPoint);

将产生以下内容:

cgPoint: (100, 200)

有几个函数,比如:

NSStringFromCGPoint
NSStringFromCGSize
NSStringFromCGRect
NSStringFromCGAffineTransform
NSStringFromUIEdgeInsets

一个例子:

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));

由于Stack Overflow的坏RSS刚刚为我复活了这个问题,这是我的几乎通用的解决方案:JAValueToString

这让你可以编写JA_DUMP(cgPoint)并记录cgPoint = {0, 0}

NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));

你可以使用NSValueNSValue对象是单个C或Objective-C数据项的简单容器。它可以保存任何标量类型,如int、float和char,以及指针、结构和对象id。

例子:

  CGPoint cgPoint = CGPointMake(10,30);
NSLog(@"%@",[NSValue valueWithCGPoint:cgPoint]);

输出: NSPoint: {10, 30}

希望对你有所帮助。

NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));

是的,你可以使用以下几个函数: 首先,您必须将CGPoint结构转换为字符串,参见示例

1) NSStringFromCGPoint,
2) NSStringFromCGSize,
3) NSStringFromCGRect,
4) NSStringFromCGAffineTransform,
5) NSStringFromUIEdgeInsets,

例如:

1) NSLog(@"NSStringFromCGPoint = %@", NSStringFromCGRect(cgPointValue));

像这样…

使用Objective-C方式从C原语创建对象

CGRect rect = CGRectMake(1, 2, 3, 4);
CGSize size = CGSizeMake(1, 2);
NSLog(@"%@, %@",@(rect), @(size));

输出:NSRect: \{\{1,2}, {3,4}}, NSSize: {1,2}