Est-il possible de NSLog C Structs (comme CGRect ou CGPoint)?


413

Je veux pouvoir déboguer les structures C sans avoir à taper explicitement toutes les propriétés qui les composent.

c'est-à-dire que je veux pouvoir faire quelque chose comme ça:

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

De toute évidence, le '% @' ne fonctionnera pas, d'où la question.


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

Essayez LOG_EXPR à partir de la bibliothèque VTPG_Common: vgable.com/blog/tag/log_expr
— LearnCocos2D

Réponses:


806

Vous pouvez essayer ceci:

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

Il existe un certain nombre de fonctions fournies par UIKit qui convertissent les différentes structures CG en NSStrings. La raison pour laquelle cela ne fonctionne pas est parce qu'il %@signifie un objet. A CGPointest une structure C (tout comme CGRects et CGSizes).


7
Avec AppKit sur OS X, vous devez convertir en NSPointpuis appeler NSStringFromPoint. Par exemple:NSStringFromPoint(NSPointFromCGPoint(point))
— Alex

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

Similaire aux préfixes UI, MK, CL qui, bien que tous aient une signification et doivent importer un fichier .h respectif comme: UIKit, MapKit, CoreLocation; Le préfixe CG signifie-t-il que je devrais importer quelque chose? Si ce n'est pas juste une convention de dénomination?!
— Honey

231

Il y a quelques fonctions comme:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Un exemple:

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

4
Ce sont les: "chose unique dans tout le développement iOS qui est la plus utile mais la moins connue" !! Heh
— Fattie

7
Remarque: pour le développement de Cocoa (OS X), ces fonctions n'ont pas "CG" dans le nom.
— peterflynn


13

J'utilise la macro suivante pour m'aider avec 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)

Vous pouvez faire quelque chose de similaire pour CGPoint:

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

L'utiliser comme suit:

LogCGPoint(cgPoint);

Produirait ce qui suit:

cgPoint: (100, 200)

6
Pourquoi ne pas simplement utiliser les fonctions de conversion de chaîne UIKit intégrées ?
— ma11hew28

Je le fais maintenant. Ce sont exactement les fonctions qu'Alex et Steve ont affichées dans leurs réponses.
— e.James

1
Vaut-il la peine d'éditer la réponse et d' ajouter une note en haut "Pour un intérêt historique seulement ...". Je fais toujours cela, par exemple stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/… ( "Il vaut la peine de noter que ce billet de la décennie précédente n'a vraiment qu'un intérêt historique. " ) etc
— Fattie

1
Cette réponse est toujours utile, malgré l'existence de fonctions de conversion UIKit, car il existe d'autres structures dans d'autres frameworks, qui n'ont pas d'aides NSStringFrom (par exemple. MKCoordinateRegion).
— Greg Bell

10

Vous pouvez utiliser NSValuepour cela. Un objet NSValue est un simple conteneur pour un seul élément de données C ou Objective-C. Il peut contenir n'importe quel type scalaire tel que int, float et char, ainsi que des pointeurs, des structures et des identifiants d'objet.

Exemple:

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

PRODUCTION : NSPoint: {10, 30}

J'espère que cela vous aide.


Merci @Nishant - nécessaire pour sortir le contenu d'un CMTimeRange et cela a fait l'affaire. Beaucoup plus de possibilités que NSStringFrom ...
— amergin

5

Puisque le RSS cassé de Stack Overflow vient de ressusciter cette question pour moi, voici ma solution presque générale: JAValueToString

Cela vous permet d'écrire JA_DUMP(cgPoint)et de vous cgPoint = {0, 0}connecter.


J'ai fait ça et j'ai eu une erreur de compilation. Parfois, l'adresse de l'expression de la propriété est requise ou quelque chose
— user4951

@Jim Thio: la macro est configurée de telle manière que l'objet inspecté doit être une valeur l. (Je ne me souviens pas pourquoi; quelque chose sur le fait de ne pas pouvoir gérer correctement les chaînes C autrement.) En bref, affectez votre propriété à une variable temporaire, puis appelez JA_DUMP à ce sujet.
— Jens Ayton

5

Oui, vous pouvez utiliser quelques fonctions comme ci-dessous: Vous devez d'abord convertir la structure CGPoint en chaîne, voir l'exemple

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

Par exemple:

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

Comme ça...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.