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