¿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.

mazniak
fuente
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).

Alex
fuente
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));
Steve
fuente
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
17
NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));
Abhishek Bedi
fuente
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)
e.James
fuente
66
¿Por qué no usar las funciones de conversión de cadenas UIKit integradas ?
ma11hew28
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.

Nishant Tyagi
fuente
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.

Jens Ayton
fuente
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...

Vaibhav Shiledar
fuente
2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
UdayM
fuente