¿Es posible NSLog C Structs (como CGRect o CGPoint)?


413

Quiero poder depurar estructuras C sin tener que escribir explícitamente cada propiedad en la que consisten.

es decir, quiero poder hacer algo como esto:

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

Obviamente el '% @' no funcionará, de ahí la pregunta.


2
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi

Pruebe LOG_EXPR de la biblioteca VTPG_Common: vgable.com/blog/tag/log_expr
LearnCocos2D

Respuestas:


806

Puedes probar esto:

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

Hay una serie de funciones proporcionadas por UIKit que convierten las diversas estructuras CG en NSStrings. La razón por la que no funciona es porque %@significa un objeto. A CGPointes una estructura C (y también lo son CGRects y CGSizes).


77
Con AppKit en OS X, necesitaría convertir a un NSPointy luego llamar NSStringFromPoint. Por ejemplo:NSStringFromPoint(NSPointFromCGPoint(point))
Alex

19
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi

Similar a los prefijos UI, MK, CL que, si bien todos tienen significados y necesitan importar un archivo .h respectivo como: UIKit, MapKit, CoreLocation; ¿El prefijo CG significa que debo importar algo? Si no es así, ¿es solo una convención de nombres?
Miel

231

Hay algunas funciones como:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Un ejemplo:

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

44
Estos son: "¡una cosa en todo el desarrollo de iOS que es más útil pero menos conocida"! Je
Fattie

77
Nota: para el desarrollo de Cocoa (OS X), estas funciones no tienen "CG" en el nombre.
peterflynn


13

Utilizo la siguiente macro para ayudarme con 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)

Podrías hacer algo similar para CGPoint:

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

Usándolo de la siguiente manera:

LogCGPoint(cgPoint);

Produciría lo siguiente:

cgPoint: (100, 200)


Ahora si. Esas son exáctamente las funciones que Alex y Steve publicaron en sus respuestas.
e.James

1
Valdría la pena editar la respuesta y agregar una nota en la parte superior "Solo para interés histórico ...". Siempre hago eso, por ejemplo stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/… ( "Vale la pena señalar que esta publicación de la década anterior, ahora es solo de interés histórico " ), etc.
Fattie

1
Esta respuesta sigue siendo útil, a pesar de la existencia de funciones de conversión UIKit, porque existen otras estructuras en otros marcos, que no tienen ayudantes NSStringFrom (por ejemplo, MKCoordinateRegion).
Greg Bell

10

Puedes usar NSValuepara esto. Un objeto NSValue es un contenedor simple para un solo elemento de datos C o Objective-C. Puede contener cualquiera de los tipos escalares como int, float y char, así como punteros, estructuras e identificadores de objeto.

Ejemplo:

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

SALIDA NSPoint: {10, 30}

Espero que te ayude.


Gracias @Nishant: necesitaba dar salida al contenido de un CMTimeRange y esto funcionó. Mucho más posibilidades que NSStringDesde ...
amergin 03 de

5

Dado que el RSS roto de Stack Overflow acaba de resucitar esta pregunta para mí, aquí está mi solución casi general: JAValueToString

Esto le permite escribir JA_DUMP(cgPoint)y cgPoint = {0, 0}registrarse.


Lo hice y obtuve un error de compilación. A veces se requiere una dirección de expresión de propiedad o algo así
user4951

@ Jim Thio: la macro está configurada de tal manera que el objeto que se está inspeccionando debe ser un valor l. (No puedo recordar por qué; algo sobre no poder manejar las cadenas C de otra manera). En resumen, asigne su propiedad a una variable temporal, luego llame a JA_DUMP sobre eso.
Jens Ayton

5

Sí, puede usar algunas funciones como: Primero, debe convertir la estructura CGPoint en una cadena, vea el ejemplo

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

Por ejemplo:

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

Me gusta esto...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.