ChatGPT解决这个技术问题 Extra ChatGPT

是否可以使用 NSLog C 结构(如 CGRect 或 CGPoint)?

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

即我希望能够做这样的事情:

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

显然 '%@' 不起作用,因此问题。

NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));
尝试 VTPG_Common 库中的 LOG_EXPR:vgable.com/blog/tag/log_expr

j
jscs

你可以试试这个:

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

有许多函数 provided by UIKit 可以将各种 CG 结构转换为 NSString。它不起作用的原因是因为 %@ 表示一个对象。 CGPoint 是 C 结构(CGRectCGSize 也是如此)。


在 OS X 上使用 AppKit,您需要转换为 NSPoint,然后调用 NSStringFromPoint。例如:NSStringFromPoint(NSPointFromCGPoint(point))
NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));
类似于 UI、MK、CL 前缀,虽然它们都有含义,但需要导入相应的 .h 文件,如:UIKit、MapKit、CoreLocation; CG 前缀是否意味着我应该导入任何东西?如果不是只是一个命名约定?!
m
marzapower

有几个功能,例如:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

一个例子:

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

这些是:“所有 iOS 开发中最有用但最不为人知的一件事”!呵呵
注意:对于 Cocoa (OS X) 开发,这些函数的名称中没有“CG”。
A
Abhishek Bedi
NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));

e
e.James

我使用以下宏来帮助我解决 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)

为什么不直接使用内置的 UIKit String Conversion Functions
我现在做的。这些正是亚历克斯和史蒂夫在他们的答案中发布的功能。
是否值得编辑答案并在顶部“仅出于历史兴趣...”添加注释。我总是这样做,例如 stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/…“值得注意的是,过去十年的这篇文章现在真的只具有历史意义。”)等
尽管存在 UIKit 转换函数,但这个答案仍然有用,因为其他框架中还有其他结构,它们没有 NSStringFrom 帮助器(例如 MKCoordinateRegion)。
N
Nishant Tyagi

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

例子:

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

输出: NSPoint: {10, 30}

希望它可以帮助你。


N
NANNAV

由于 Stack Overflow 损坏的 RSS 刚刚为我重新提出了这个问题,所以这是我几乎通用的解决方案:JAValueToString

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


我这样做了,我得到了编译错误。有时需要属性表达式的地址或其他东西
@Jim Thio:宏的设置方式是,被检查的对象必须是左值。 (我不记得为什么;否则无法正确处理 C 字符串。)简而言之,将您的属性分配给一个临时变量,然后在其上调用 JA_DUMP。
H
Hussain Shabbir

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

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

例如:

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

像这样...


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